Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在主干模型中正确实现解析以包含集合?_Javascript_Backbone.js - Fatal编程技术网

Javascript 如何在主干模型中正确实现解析以包含集合?

Javascript 如何在主干模型中正确实现解析以包含集合?,javascript,backbone.js,Javascript,Backbone.js,我有一个称为成员的主干模型——它包含成员数据,如名字、姓氏、电子邮件、电话等。它还包括我需要保留为集合的多值字段——这些字段是学位和附属机构 在我的模型中调用fetch()方法时遇到的问题是,基本数组和模型中的集合对象之间存在阻抗不匹配。由于根据定义,parse应该返回一个散列以在set中使用,而不是实际设置值,因此我不可能以这种方式设置集合。例如,如果我为Degrees返回一个JavaScript对象,该对象看起来如下:{Degrees:[{id:1,title:“PhD”}},那么这会将我的

我有一个称为
成员的主干模型
——它包含成员数据,如名字、姓氏、电子邮件、电话等。它还包括我需要保留为集合的多值字段——这些字段是
学位
附属机构

在我的模型中调用
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;     
}

我怀疑这是最佳的解决方案,但它目前确实有效。我愿意接受更好的建议。

我使用与您建议的解决方案完全相同的解决方案,只是做了一些更改

  • 为了避免误解,我在JSON中调用集合:
    degreesData
  • 在初始化中,我创建了如下集合:
    this.degrees=newdegrees().reset(this.get(“degreesData”)

  • 尝试以下操作:放弃
    parse:
    函数(似乎不需要它),而是在
    initialize:
    内部手动将
    degrees
    属性从数组转换为主干集合…
    parse
    fetch
    方法返回后自动调用。调用
    fetch
    后,我可以手动将
    degrees
    属性重置回一个集合,但这样我就不会在该集合中拥有我想要的任何数据……而且数据正在进入。如果在
    解析中手动添加
    degrees
    ,您将不得不对
    degrees
    执行很多操作。按照@ŠimeVidas的建议,为他们使用主干集合。它可以让你以主干的方式处理每一个
    学位?在实例化模型时初始化运行。。degreesData在获取之后才会填充,这是在初始化中执行的。@raynjamin我在初始化中填充的是
    degrees
    集合号
    degreesData
    属性。
    degreesData
    属性作为初始JSON的一部分,用于初始化模型,因此此信息可在
    initialize()
    中找到。(如果我没记错的话)再次挖掘这个,如果你需要初始化一个空模型怎么办?你必须开始用默认值之类的东西编码。也许解析是一个更好的选择,至少你(几乎)保证在那一点上有数据。