【问题标题】:Backbone defaults being referenced on property change在属性更改时引用主干默认值
【发布时间】:2011-10-06 11:46:03
【问题描述】:

我有以下型号:

var Soq = Backbone.model.extend({
    default:{
        'name': 'something'
        , 'parents': []       //array will be passed by reference to attributes hash on new object instantiation
    } 
});

我是 javascript 和主干的新手,但查看源代码我认为可能发生的情况是,当此模型的属性设置为默认值 (backbone.js: 137) 并且默认值是一个对象时,它由参考。这意味着当我做这样的事情时:

var soq = new Soq;
var parents = soq.get('parents');
parents.push('parent');               //changes defaults of the proto object

var soq2 = new Soq;
console.log(soq2.get('parents'););  //will output ['parent']
console.log(soq2.defaults.parents); //will output ['parent']

我是否正确理解这一点?如果是这样,最好的方法是设置作为对象的默认值,而不会使它们在将来的实例引用它们时随时更改?

如果我不清楚或误解了什么,请告诉我。提前感谢您的宝贵时间。

【问题讨论】:

    标签: javascript backbone.js


    【解决方案1】:

    您的“父母”属性在每个实例上都是相同的,因为它是在原型上设置的。换句话说,在构造模型时将使用相同的对象来设置模型,因此您将获得相同的数组引用。

    相反,您希望在每次构建新模型时创建一个新的默认对象。 Backbone 允许您将默认值定义为函数:

    defaults: function() { 
        return {
            name: 'something', 
            parents: [] 
        }; 
    }
    

    【讨论】:

    • 谢谢,太好了。在看到这个之前,我在 initialize() 函数中进行了各种烦人的检查。解决方案现在似乎很明显:)
    猜你喜欢
    • 2015-09-08
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    • 2014-12-26
    • 2021-01-02
    • 1970-01-01
    相关资源
    最近更新 更多