ASP.NET AJAX 4最近添加了跟踪客户端ADO.NET Data Services对象更改的功能。这让我想知道跟踪JavaScript库的其他变化是什么。有没有人见过,或者你在使用它们?
编辑:只是为了澄清“更改跟踪”的含义:新版本的ASP.NET AJAX允许您检索JavaScript对象,在客户端上对其进行更改,然后仅发送 那些更改回服务器。
答案 0 :(得分:6)
我不知道一个框架,但使用prototypal inheritance和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);
一个警告:原型继承(缺乏更好的词)“浅”。如果对象具有任何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;
}
答案 1 :(得分:2)
我知道这是一个非常古老的问题,但我开始构建一个变更跟踪和(在其中)实体建模Javascript框架,我将其命名为“tent”(有点蹩脚的名字......),它的开源和托管于:
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的关系等。
答案 2 :(得分:1)
如果仅那些更改,则表示字段级别更改,那么我不知道任何可以开箱即用的方式。对于对象/记录级别,具有已定义数据api(dojo,yui 2/3,ext,sproutcore,activejs)的每个框架都提供了一些内容,允许您在存储中的对象发生更改时将数据返回到服务器。 / p>
Sproutcore在商店中跟踪干净/脏记录以进行批量上传。加上一般的键值观察实用程序应该调整它以支持字段级别的更改应该是微不足道的,如果这是你正在寻找的。 p>
答案 3 :(得分:0)
Comet可能会通过将更改推送到客户端来进行更改跟踪(而不是为它们轮询服务器):
答案 4 :(得分:0)
很久以前就问过这个问题,但是如果有人觉得有帮助,可以用一个现代答案:https://github.com/TrackableEntities/trackable-entities-js