JavaScript是否有用于跟踪更改的框架?

3
最近,ASP.NET AJAX 4 新增了在客户端跟踪 ADO.NET 数据服务对象更改的功能。这让我想知道是否存在其他变更跟踪 JavaScript 库。你看到过或正在使用任何库吗?
编辑:为了澄清我所说的“变更跟踪”,ASP.NET AJAX 的新版本允许您检索 JavaScript 对象,在客户端对其进行更改,然后仅将那些更改发送回服务器。
5个回答

7

我不知道有什么框架,但是使用原型继承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);

需要注意的是,原型继承是“浅层的”(缺乏更好的词汇)。如果对象具有任何数组或对象属性,则修改它们将修改原始对象,这可能不是您想要的。它们也不会被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;
}

哇!我向你的JavaScript魔法低头。 :-) - GuyBehindtheGuy
你的努力得到了奖励,Noah。不过我真希望我能发现一个新的框架。 - GuyBehindtheGuy
谢谢让我对JavaScript的原型有了更好的兴趣,这将填补我在JavaScript知识方面的严重空白... - Gaute Løken

2
我知道这是一个很老的问题,但我开始构建一个更改跟踪和(在其之上)实体建模Javascript框架,我将其命名为“tent”(有点lame...),它是开源的并托管在:https://github.com/benjamine/tent。该框架已通过JSDoc文档记录并使用js-test-driver进行单元测试。您可以仅使用更改跟踪模块:
   var myobject = { name: 'john', age: 34 };

   // add a change handler that shows changes on alert dialogs
   tent.changes.bind(myobject, function(change) {
       alert('myobject property '+change.data.propertyName+' changed!');
   });

   myobject.name = 'charly'; // gets notified on an alert dialog

它还可以处理数组的更改(添加、删除)。 此外,您可以使用“实体”上下文来保留所有检测到的更改(添加、删除、修改的项)的更改集,按集合分组,级联添加和删除,保持反向属性同步,跟踪1对1、1对N和N对M关系等。


1

如果你所说的“仅仅”指的是字段级别的更改,那么我不知道有什么东西可以直接这样使用。对于对象/记录级别,每个具有定义数据API(dojo,yui 2/3,ext,sproutcore,activejs)的框架都提供了一些方法来让您在商店中更改对象时将数据返回到服务器。

Sproutcore 在为批量上传跟踪干净/脏记录存储方面走得更远。再加上一般的键值观察实用程序,如果您正在寻找支持字段级别更改的功能,那么调整它应该是微不足道的。


0

Comet 可以潜在地用于通过将更改推送到客户端(而不是轮询服务器)来进行更改跟踪:

Comet


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接