骨干模型克隆创建对原始模型的引用

时间:2015-02-14 09:08:37

标签: javascript backbone.js model clone single-page-application

我有一个ViewogView视图,它实际上是一个弹出窗口,如下所示:

var DialogView = Backbone.View.extend({
        events : {
            'click a._save' : '_save',
            'change input._adjust' : '_calculateAdjustedPrice'
        },
        initialize : function(options) {
            this.realModel = options.model;
            this.model = (this.realModel).clone();
        },
        save : function() {
            this.model = this.realModel;
        }
        return DialogView;
    });

在另一个视图中,单击alink时会执行以下代码以打开弹出窗口:

var dialogView = new DialogView({
                        model : dialogModel
                    });

在这个DialogView中,有一些事件被触发,基于这些事件传递给视图的模型被更改。有一个按钮,保存在视图中,单击时应保持更改的模型不变(无所事事,因为模型值在事件上更改,单击保存时我有更改的模型)。 但是如果在没有单击“保存”的情况下关闭DialogView,则模型中所做的更改不应该保留,并且应该恢复到其原始状态。

我在DialogView代码中使用了Backbone的model.clone()方法。 但似乎clone()并没有创建原始模型的副本,而只是引用相同的模型。每当this.model中的值发生变化时,realModel中的值也会发生变化。我希望在事件被触发时,然后在DialogView模型中更改值,但发送到DialogView的原始模型保持原样,这样如果我关闭DialogView而不保存,则传递给此视图的模型中的值保持不变。

根据BAckbone文档,clone会创建一个新的模型实例,但我上面的研究似乎给出了不同的结果。我在这里理解错了吗?

1 个答案:

答案 0 :(得分:0)

传递给DialogView的对话框模型有一个javascript对象。由于clone()不进行深度克隆,因此该对象的引用被传递给克隆模型。因此,当克隆模型中该对象的任何属性发生变化时,它也反映在原始模型中。