0

我会尽量简洁地描述这一点。在我正在开发的应用程序中,保存了 Backbone 模型,然后可以稍后对其进行编辑。目前,我将它设置为功能完全动态的地方。

例子:this.model.set('attribute', value)

那里有标准的东西。这就是问题所在。客户端希望在用户明确单击保存并完成按钮之前不保存更新的模型。

以前,我使用这种模式进行编辑:

this.model = options.previousModel || new NamedBackboneModel({
    id: this.model.get('id'),
    attr: otherModel.get('attr')
});

我已经将该示例中的属性和模型名称设为通用名称,但效果很好。在整个视图中,我会使用model.set('attr' value)它,它是完美的。

我可以对previousModel进行编辑而不立即将它们保存到以前的模型的最佳方式是什么?

我研究过使用普通对象来跟踪更改,但我认为必须有一种更好的方法,它更符合典型的 Backbone 模式。

自然地,我尝试了,new NamedBackboneModel(options.previousModel.toJSON())但由于模型上的嵌套集合没有按预期工作,并且需要进行一些架构更改。

我认为previousModel 上的克隆可以工作,但我也没有任何运气使用这种方法。感谢您的帮助,如果我需要提供更多说明,请告诉我。

4

2 回答 2

1

我认为你应该{silent: true}在你打电话时通过model.set()

model.previousAttributes()然后,您可以通过调用获取所有先前的属性来检索先前值的列表。或model.previous("name")获取特定属性。

当你想丢弃之前的属性时,你可以调用model.change()来调用'change'事件。

当您要保存时,您可以model.save({silent:false})将其保存并丢弃以前的属性,或者传递{silent:true}将保留以前的更改。

于 2013-02-12T14:00:43.727 回答
0

我最终使用了多种方法来完成这项工作。我向模型添加了存储和恢复功能,如下所示:

store: function() {
    this._storedAttributes = _.clone(this.attributes);
    this._storedCollection = _.clone(this.collection().toJSON());
},

revert: function() {
    if (this._storedAttributes) {
        this.set(this._storedAttributes, {
            silent: true
        });
        this.collection.remove(this.collection.models, { silent: true });
        this.collection.reset(this._storedCollection, { silent: true });

        // For syncing local storage up the chain
        if(!this.isNew()) { this.trigger('change'); }
    }
},
于 2013-02-12T19:18:20.377 回答