0

我正在尝试在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 });
    }
});
4

2 回答 2

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,否则您不会收到事件。getset
于 2013-01-23T22:21:07.627 回答
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;
    }
});
于 2013-01-23T22:19:45.057 回答