我有叫Member
骨干模型 - 这包含会员资料,如名字,姓氏,电子邮件,电话等,还包括多值字段我需要保持作为集合 - 这是Degrees
和Affiliations
。如何正确实现在Backbone模型中解析以包含集合?
我在模型中调用fetch()
方法时遇到的问题是,基本数组与我的模型中的集合对象之间存在阻抗不匹配。由于parse
根据定义应该返回一个在set
中使用的散列,而不是实际设置值,所以我不可能以这种方式设置我的集合。例如 - 如果我返回一个Degrees
的JavaScript对象,如下所示:{degrees: [{id: 1, title: "PhD"}]}
,那么这会将我的degree
集合转换为平面数组。这里是我的代码:
window.Models.Member = Backbone.Model.extend({
url: '/api/member',
initialize: function() {
_.bindAll(this);
this.set('degrees', new window.Collections.DegreesList());
this.fetch();
},
parse: function(response) {
var setHash = {};
setHash.first_name = response.first_name;
setHash.last_name = response.last_name;
setHash.office_phone = response.office_phone;
// When this is run, this.get('degrees') will now return a flat array rather than a DegreesList collection
setHash.degrees = _(response.degrees).each(function(item) {
return {id: item.id, title: item.title}
});
return setHash;
}
});
我可以手动设置我的解析函数的集合,但是,似乎是它颠覆主干路,哈克。
编辑:我已经暂时通过以下操作解决了这个问题:
parse: function(response) {
var setHash = {};
setHash.first_name = response.first_name;
setHash.last_name = response.last_name;
setHash.office_phone = response.office_phone;
this.get('degrees').reset(response.degrees);
return setHash;
}
我怀疑这是最佳的解决方案,但它肯定适用于现在。我愿意提供更好的建议。
试试这个:沟'解析:'函数(它不似乎并不需要),而是在'initialize:'中手动将'degrees'属性从数组转换为Backbone集合... – 2012-02-29 00:40:52
'fetch'方法返回后''parse'会自动调用。在调用fetch之后,我可以手动将'degrees'属性重置回集合,但是我不会在该集合中包含任何我想要的数据...并且数据正在进入。 – rybosome 2012-02-29 03:15:56
您将拥有如果手动将它们添加到'parse'中,可以使用'度数'来做很多事情。去@ŠimeVidas的建议,并为他们使用Backbone集合。它让你处理每个'度'的骨干方式。 – sntran 2012-03-01 03:13:12