I’m not sure what to call this. It’s a proxy handler that watches the dirty state of an object. I don’t know why, but I’m kinda proud of this. It also has the ability to ignore fields. The main goal is to have a mechanism to indicate if you should save an object or not. In other words:
if (obj.dirty) { save(obj); }
window.objHandler = {
dirty: false,
ignore: [],
get: function(target, name) {
if (name != "dirty" && name != "ignore") {
return name in target ? target[name] : undefined;
}
if (name == "ignore") {
return this.ignore;
}
if (name == "dirty") {
// console.log("get dirty:", target);
if (this.dirty) {
return true;
}
if (typeof target == "object") {
if (target.dirty) {
return true;
}
for (k in target) {
if (typeof target[k] == "object" && target[k].dirty) {
return true;
}
}
}
return this.dirty;
}
return undefined;
},
set: function(target, name, value) {
if (name == "dirty") {
this.dirty = value;
if (typeof target == "object") {
for (k in target) {
if (typeof target[k] == "object") {
target[k].dirty = value;
}
}
}
return;
}
if (name == "ignore") {
this.ignore = value;
return;
}
if (angular.equals(target[name], value)) {
return;
}
if (this.ignore.indexOf(name) == -1) {
this.dirty = true;
}
var _type = typeof value;
if (_type == "object") {
// console.log("making proxy:", value);
value = new Proxy(value, window.objHandler);
value.dirty = true;
}
target[name] = value;
}
};
var p = new Proxy({}, window.objHandler);
p.obj = {"foo":"bar"};
if (!p.dirty) {
console.log("FAIL", "!p.dirty", "p should be dirty because obj was set");
}
if (!p.obj.dirty) {
console.log("FAIL", "!p.obj.dirty", "p.obj should be dirty because it's new?");
}
p.obj.dirty = false;
if (p.obj.dirty) {
console.log("FAIL", "p.obj.dirty", "Shouldn't be dirty because p.obj.dirty = false;");
}
if (p.dirty) {
console.log("FAIL", "p.dirty", "Should still be dirty p.obj.dirty = false;");
}
p.dirty = false;
if (p.dirty) {
console.log("FAIL", "p.dirty", "Should be clean");
}
p.obj.foo = "baz";
if(!p.dirty) {
console.log("FAIL", "p.dirty should be true");
}
if (!p.obj.dirty) {
console.log("FAIL", "p.obj.dirty should be true");
}
p.dirty = false;
if(p.obj.dirty) {
console.log("FAIL", "p.obj.dirty should not be dirty");
}
console.log("p.dirty:",p.dirty);
console.log("p.obj.dirty", p.obj.dirty);
p.str = "string value";
p.integer = 1;
p.dec = 1.1;
console.log(JSON.stringify(p,null, "\t"));
console.log("p.dirty", p.dirty);
p.dirty = false;
Output:
p.dirty: false p.obj.dirty false { "obj": { "foo": "baz" }, "str": "string value", "integer": 1, "dec": 1.1 } p.dirty true
