2011-06-28 37 views
23

我有我的页面上的“取消”按钮,这应该恢复我做回它从服务器加载的状态下,所有的变化..如何回滚backbone.js模型更改?

我想我需要存储Backbonejs模型的初始状态和恢复当前(改变)状态返回到初始状态。

实现该目标的最佳方法是什么?

谢谢

回答

11

FWIW - 我写了一个插件来自动处理这个问题,特别是与记“取消”按钮的想法:http://github.com/derickbailey/backbone.memento

+0

感谢您的插件。这句话中是否有拼写错误(取自github页面)? “一定要在model.js文件后包含modelbinding文件。”,其中modelbinding应该读取记忆? – archmage

+0

哎呀!是的,复制和粘贴错误:P –

+0

backbone.memento仍然可以在backbone 1.1中使用吗?我看到最后一次提交已经在2012年。 – Roberto

8

我不相信有一个方法调用返回一个模型,其未编辑的状态..但未经编辑的值都可以单独通过model.previous(属性)和集体通过model.previousAttributes。

7

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 
    }, 

}); 
2

这里是我想出了:

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); 
    } 
}); 
0

看看纽约时报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的 状态更新事件,并有一些选项可以选择加入 在路由到新的上下文之前提示确认。

相关问题