2012-02-29 49 views
5

我有叫Member骨干模型 - 这包含会员资料,如名字,姓氏,电子邮件,电话等,还包括多值字段我需要保持作为集合 - 这是DegreesAffiliations如何正确实现在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;  
} 

我怀疑这是最佳的解决方案,但它肯定适用于现在。我愿意提供更好的建议。

+4

试试这个:沟'解析:'函数(它不似乎并不需要),而是在'initialize:'中手动将'degrees'属性从数组转换为Backbone集合... – 2012-02-29 00:40:52

+0

'fetch'方法返回后''parse'会自动调用。在调用fetch之后,我可以手动将'degrees'属性重置回集合,但是我不会在该集合中包含任何我想要的数据...并且数据正在进入。 – rybosome 2012-02-29 03:15:56

+0

您将拥有如果手动将它们添加到'parse'中,可以使用'度数'来做很多事情。去@ŠimeVidas的建议,并为他们使用Backbone集合。它让你处理每个'度'的骨干方式。 – sntran 2012-03-01 03:13:12

回答

2

我使用完全相同的解决方法,你提出的除了一些变化。

  1. 为了避免误解,我呼吁在JSON集合:degreesData
  2. initialize我创建集合是这样的:this.degrees = new Degrees().reset(this.get("degreesData"));
+0

对于挖掘旧问题抱歉,但是如何从初始化中获取degreeData?在实例化模型时初始化运行..degressData直到获取后才会填充,INSIDE初始化。 – raynjamin 2013-11-05 23:35:51

+0

@raynjamin我在初始化时填充的是'度数'集合,没有'degreesData'属性。 'degreesData'属性是用来初始化模型的初始JSON的一部分,因此这个信息在'initialize()'中可用。 _(如果我没有记错的话)_ – fguillen 2013-11-06 09:24:18

+0

再次挖掘它,如果你需要初始化一个空模型呢?你将不得不开始编码默认和东西。也许解析是一个更好的选择,至少你(几乎)保证在这一点上有数据。 – backdesk 2014-07-25 13:58:22

相关问题