我有我的页面上的“取消”按钮,这应该恢复我做回它从服务器加载的状态下,所有的变化..如何回滚backbone.js模型更改?
我想我需要存储Backbonejs模型的初始状态和恢复当前(改变)状态返回到初始状态。
实现该目标的最佳方法是什么?
谢谢
我有我的页面上的“取消”按钮,这应该恢复我做回它从服务器加载的状态下,所有的变化..如何回滚backbone.js模型更改?
我想我需要存储Backbonejs模型的初始状态和恢复当前(改变)状态返回到初始状态。
实现该目标的最佳方法是什么?
谢谢
FWIW - 我写了一个插件来自动处理这个问题,特别是与记“取消”按钮的想法:http://github.com/derickbailey/backbone.memento
我不相信有一个方法调用返回一个模型,其未编辑的状态..但未经编辑的值都可以单独通过model.previous(属性)和集体通过model.previousAttributes。
model.previousAttributes()
返回所有以前的属性,而model.changedAttributes()
返回所有更改的属性,但与他们的新值(或者false
如果没有改变)。所以,你可以将它们组合起来在你的原型写cancelChanges
方法:
var MyModel = Backbone.Model.extend({
cancelChanges: function() {
var changed = this.changedAttributes();
if(!changed)
return;
var keys = _.keys(changed);
var prev = _.pick(model.previousAttributes(), keys);
this.set(prev, {silent: true}); // "silent" is optional; prevents change event
},
});
这里是我想出了:
var RollbackEnabledModel = Backbone.Model.extend({
initialize: function() {
this._initAttributes = _.clone(this.attributes);
},
parse: function(data) {
this._initAttributes = _.clone(data);
return data;
},
rollback: function() {
this.set(this._initAttributes);
}
});
看看纽约时报backbone.trackit。它跟踪对模型的多个更改,而不仅仅是最近的更改,如model.changedAttributes()
和model.previousAttributes()
。自述:
var model = new Backbone.Model({id:1, artist:'Samuel Beckett', 'work':'Molloy'});
model.startTracking();
model.set('work', 'Malone Dies');
console.log(model.unsavedAttributes()); // >> Object {work: "Malone Dies"}
model.set('period', 'Modernism');
console.log(model.unsavedAttributes()); // >> Object {work: "Malone Dies", period: "Modernism"}
model.save({}, {
success: function() {
console.log(model.unsavedAttributes()); // >> false
}
});
此外,该库将功能添加到
resetAttributes
到 原来的状态自从上次保存,触发时unsavedChanges
的 状态更新事件,并有一些选项可以选择加入 在路由到新的上下文之前提示确认。
感谢您的插件。这句话中是否有拼写错误(取自github页面)? “一定要在model.js文件后包含modelbinding文件。”,其中modelbinding应该读取记忆? – archmage
哎呀!是的,复制和粘贴错误:P –
backbone.memento仍然可以在backbone 1.1中使用吗?我看到最后一次提交已经在2012年。 – Roberto