在backbone.js中设置数组值初始化函数

时间:2013-01-23 21:26:19

标签: backbone.js

我正在尝试在backbone.js模型初始化函数中设置数组值。在以'this.set ...'开头的行中,我收到'意外字符串'错误。是不是可以这样设置数组值?

谢谢!

var bGenericItem = Backbone.Model.extend({

    defaults: {
        attrArray: new Array({'item_id': '', 'type': '', 'name':''})
    },
    initialize: function(){
        // Set the id to cid for now
        this.set({ attrArray["item_id"]: this.cid });
    }
});

2 个答案:

答案 0 :(得分:2)

你想要做的事没有任何意义。您的defaults是一个包含单个对象的数组:

defaults: {
    attrArray: [
        { item_id: '', type: '', name: '' }
    ]
},

如果要保存属性对象列表,则可以使用数组。但是,如果您有一个属性对象列表,您希望item_id引用哪个attrArray['item_id']?您是否假设attrArray将始终初始化为默认值,并且没有人会在模型的初始数据中发送attrArray?如果是这样,你会想要更像这样的东西:

// Use a function so that each instance gets its own array,
// otherwise the default array will be attached to the prototype
// and shared by all instances.
defaults: function() {
    return {
        attrArray: [
            { item_id: '', type: '', name: '' }
        ]
    };
},
initialize: function() {
    // get will return a reference to the array (not a copy!) so
    // we can modify it in-place.
    this.get('attrArray')[0]['item_id'] = this.cid;
}

请注意,您将遇到需要特殊处理的数组属性的一些问题:

  1. get('attrArray')将返回对模型内部数组的引用,因此修改该返回值将更改模型。
  2. a = m.get('attrArray'); a.push({ ... }); m.set('attrArray', a)之类的内容无法按预期方式运行,set不会注意到数组已更改(因为它没有,a == a为真毕竟,除非您在"change"attrArray之间某处克隆get,否则您将无法获得set个事件。

答案 1 :(得分:1)

您的代码有几个问题

1:defaults设置是一个对象文字,这意味着您为其分配的值会在定义后立即设置。您需要将默认值设置为函数,而不是文字值。这将确保每个模型实例都获得它自己的默认值副本,而不是在每个模型实例之间共享副本。

2:您也不应该使用new Array,只需使用数组文字语法[]。但是你在这段代码中并没有真正使用数组,所以我现在删除了数组包装器。

3:您无法直接访问attrArray。您必须从模型的属性中获取它,然后更新它


var bGenericItem = Backbone.Model.extend({

    defaults: function(){
      return {
        attrArray: {'item_id': '', 'type': '', 'name':''}
      };
    },
    initialize: function(){
        // Set the id to cid for now
        var arr = this.get("attrArray");
        arr["item_id"] = this.cid;
    }
});