我有一个称为Member的主干模型-它包含成员资格数据,例如名字,姓氏,电子邮件,电话等。它还包含我需要保留为集合的多值字段-这些是DegreesAffiliations

在模型中调用fetch()方法时遇到的问题是,基本数组与模型中的收集对象之间存在某种阻抗不匹配的情况。由于按定义,parse应该返回一个哈希表,而不是实际设置值,因此我无法以这种方式设置集合。例如-如果我为set返回一个JavaScript对象,该对象类似于以下内容:Degrees,那么这会将我的{degrees: [{id: 1, title: "PhD"}]}集合转换为一个平面数组。这是我的代码:

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函数中手动设置集合,但这似乎颠覆了Backbone的方式,而且很hacky。

编辑:我已经通过执行以下临时解决了问题:
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
  • initialize中,我像这样创建集合:this.degrees = new Degrees().reset( this.get( "degreesData" ) );
  • 08-19 17:01