我正在尝试在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 });
}
});
答案 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;
}
请注意,您将遇到需要特殊处理的数组属性的一些问题:
get('attrArray')
将返回对模型内部数组的引用,因此修改该返回值将更改模型。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;
}
});