如何编辑骨干模型并等待保存

时间:2013-02-12 05:10:09

标签: javascript backbone.js

我会尽可能简洁地描述这一点。在我正在开发的应用程序中,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进行编辑的最佳方法是什么?

我查看了使用vanilla对象来跟踪更改,但我认为必须有一种更好的方式,更典型的Backbone模式。

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

我认为previousModel上的克隆会起作用,但我也没有任何运气。感谢您的帮助,如果我需要提供更多说明,请告诉我。

2 个答案:

答案 0 :(得分:1)

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

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

如果要放弃以前的属性,可以调用model.change()来调用“更改”事件。

如果要保存,可以model.save({silent:false})保存并放弃以前的属性,或者通过{silent:true}保留以前的更改。

答案 1 :(得分: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'); }
    }
},