【问题标题】:How to Clone Models in Backbone如何在 Backbone 中克隆模型
【发布时间】:2013-07-05 05:14:11
【问题描述】:

我有一个模型可以被某个视图编辑;但是,在视图的底部,用户应该可以选择保存或放弃所有更改。这意味着您需要存储对模型进行的所有更改的列表,然后仅在单击“保存”按钮后进行这些更改。这听起来不必要地复杂,我想出了一个替代方法的想法,即创建模型的克隆并在视图中对其进行更改。然后,如果用户单击“保存”,则删除旧模型并将其集合中的旧模型替换为新模型,否则您将丢弃克隆的模型。

这是一种可接受的方法,如果是,我该如何实施克隆过程?

这相当于再次从服务器获取数据(但似乎不需要额外的 HTTP 请求)。

【问题讨论】:

  • 但是你为什么需要克隆模型呢?无论如何,您可以在 Save click 上提取所有值并保存它们;否则,如果您想知道保存时是否更改了任何值,只需执行Model View Binding..

标签: javascript backbone.js clone


【解决方案1】:

我通常使用视图上的对象缓存来解决这个问题。这样我就不会为模型/视图管理增加任何不必要的开销。如果用户在没有保存的情况下关闭视图,丢弃自然会发生。

var Model = Backbone.Model.extend({
    'title': 'Hello'
});

var View = Backbone.View.extend({
    initialize: function() {

        // Holds temporary values until save
        this.cache = {};

    },
    onTitle: function() {
        this.cache.title = 'World';
    },
    onSave: function() {
       this.model.set( this.cache );
    }
});

【讨论】:

    【解决方案2】:

    你可以试试Backbone.Memento

    如果你不想使用它没问题。但是,您可以从代码库中了解应该如何完成它。

    【讨论】:

    • 是否有理由使用上述 kalley 的方法,或者您只是提供替代方法?
    • 不,这是另一种选择。它非常小,并提供了许多其他功能。这就是我建议的原因。
    【解决方案3】:

    您可以使用clone 方法。下面的简短示例:

    var Model = Backbone.Model.extend({});
    var View = Backbone.View.extend({
        initialize: function() {
            this.realModel = this.model;
            this.model = this.realModel.clone();
        },
        onSave: function() {
            this.realModel.set(this.model.attributes);
        }
    });
    

    你也可以做一些不同的事情:

    var Model = Backbone.Model.extend({});
    var View = Backbone.View.extend({
        initialize: function() {
            // save the attributes up front, removing references
            this._modelAttributes = _.extend({}, this.model.attributes);
        },
        onSave: function() {
            // revert to initial state.
            this.model.set(this._modelAttributes);
        }
    });
    

    【讨论】:

    • this.realModel.set(this.model.attributes); 绝对安全吗?我只是在想this 的值可能会有所不同(虽然我认为this 指的是Backbone.Model,但我不确定)
    • 另外,很抱歉我的无知,但var Model = Backbone.Model.extend({}); 这条线的意义何在 - 我看不到你在任何地方使用Model。还是您只是举个例子,并建议您在创建实例时将Model 作为视图模型传入?
    • 我打算用模型初始化视图,但我没有。您可能可以忽略var Modelthisthis.realModel.set(this.model.attributes) 始终指代视图,因为那是当前上下文。
    猜你喜欢
    • 2018-12-06
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 2012-02-19
    • 2014-02-18
    • 1970-01-01
    • 2018-12-03
    相关资源
    最近更新 更多