如何回滚backbone.js模型更改?

c7rzv4ha  于 2022-11-10  发布在  其他
关注(0)|答案(5)|浏览(175)

我的页面上有一个“取消”按钮,它应该会将我所做的所有更改恢复到从服务器加载的状态。
我想我需要存储Backbonejs模型的初始状态,并将当前(已更改的)状态恢复到初始状态。
实现这一目标的最佳途径是什么?
谢谢你

lf3rwulv

lf3rwulv1#

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

wj8zmpe1

wj8zmpe12#

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

});
5jdjgkvh

5jdjgkvh3#

我不认为有一个方法调用可以将模型返回到其未编辑状态..但是未编辑的值可以单独通过model.previous(attribute)获得,也可以通过model.previousAttributes共同获得。

fwzugrvs

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);
  }
});
6qftjkof

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的状态时触发事件,并且具有选择进入在路由到新上下文之前进行确认的提示的选项。

相关问题