是否有针对JavaScript的更改跟踪框架?

Guy*_*Guy 3 javascript

ASP.NET AJAX 4最近添加了跟踪客户端ADO.NET Data Services对象更改的功能.这让我想知道跟踪JavaScript库的其他变化是什么.有没有人见过,或者你在使用任何?

编辑:只是为了澄清"更改跟踪"的含义:新版本的ASP.NET AJAX允许您检索JavaScript对象,在客户端上对其进行更改,然后仅将这些更改发送回服务器.

noa*_*oah 6

我不知道一个框架,但是使用原型继承hasOwnProperty,滚动你自己几乎是微不足道的.

function object(o) {
    function F() {}
    F.prototype = o;
    return new F();
}

var objectToTrack = getFromServer();
var objectToModify = object(objectToTrack);

edit(objectToModify); // let the user edit it...

var changes = {};
for(var p in objectToModify) {
   if(objectToModify.hasOwnProperty(p)) {
     changes[p] = objectToModify[p];
   }
}
sendChanges(changes);
Run Code Online (Sandbox Code Playgroud)

一个警告:原型继承(缺乏一个更好的词)"浅".如果对象具有任何Array或Object属性,则修改它们将修改原始文件,这可能不是您想要的.它们也不会被hasOwnProperty拾取.要解决此问题,您的编辑逻辑需要知道用户何时编辑子对象或数组属性并使用相同的技术单独跟踪它.例如,

var foo = { foo: [1,2,3], bar: 0, baz: { hello: "world!" } };
var bar = object(foo);
bar.foo[1] = 3; 
// foo.foo[1] is now also 3, but bar.hasOwnProperty('foo') returns false
bar.bar = 123; // foo is unchanged, bar.hasOwnProperty('bar') returns true

function editFooArray(index,value) {
   if(!bar.hasOwnProperty('foo')) {
     // copies the array, bar now hasOwnProperty('foo')
     bar.foo = bar.foo.slice(0); 
   }
   bar.foo[index] = value;
}

function editBazObj(property,value) {
   if(!bar.hasOwnProperty('baz')) {
     bar.baz = object(foo.baz);
   }
   bar.baz[property] = value;
}
Run Code Online (Sandbox Code Playgroud)