我的页面上有一个“取消”按钮,它应该会将我所做的所有更改恢复到从服务器加载的状态。我想我需要存储Backbonejs模型的初始状态,并将当前(已更改的)状态恢复到初始状态。实现这一目标的最佳途径是什么?谢谢你
lf3rwulv1#
FWIW -我写了一个插件来自动处理这个问题,特别是考虑到“取消”按钮的想法:http://github.com/derickbailey/backbone.memento
wj8zmpe12#
model.previousAttributes()返回所有以前的属性,而model.changedAttributes()返回所有更改的属性,但返回它们的新值(如果没有任何更改,则返回false)。因此,您可以将它们组合在一起,在原型中编写一个cancelChanges方法:
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(this.previousAttributes(), keys); this.set(prev, {silent: true}); // "silent" is optional; prevents change event }, });
5jdjgkvh3#
我不认为有一个方法调用可以将模型返回到其未编辑状态..但是未编辑的值可以单独通过model.previous(attribute)获得,也可以通过model.previousAttributes共同获得。
fwzugrvs4#
下面是我的想法:
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); } });
6qftjkof5#
看一下NYTimes的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的状态时触发事件,并且具有选择进入在路由到新上下文之前进行确认的提示的选项。
resetAttributes
unsavedChanges
5条答案
按热度按时间lf3rwulv1#
FWIW -我写了一个插件来自动处理这个问题,特别是考虑到“取消”按钮的想法:http://github.com/derickbailey/backbone.memento
wj8zmpe12#
model.previousAttributes()
返回所有以前的属性,而model.changedAttributes()
返回所有更改的属性,但返回它们的新值(如果没有任何更改,则返回false
)。因此,您可以将它们组合在一起,在原型中编写一个cancelChanges
方法:5jdjgkvh3#
我不认为有一个方法调用可以将模型返回到其未编辑状态..但是未编辑的值可以单独通过model.previous(attribute)获得,也可以通过model.previousAttributes共同获得。
fwzugrvs4#
下面是我的想法:
6qftjkof5#
看一下NYTimes的backbone.trackit。它跟踪模型的多个更改,而不是像
model.changedAttributes()
和model.previousAttributes()
那样只跟踪最近的更改。此外,该库将
resetAttributes
的功能添加到自上次保存以来的原始状态,在更新unsavedChanges
的状态时触发事件,并且具有选择进入在路由到新上下文之前进行确认的提示的选项。