Backbone Collection和Marionette CompositeView中未定义的模型原型

时间:2013-12-20 18:04:16

标签: javascript backbone.js prototype undefined marionette

尝试从值列表中填充Collection,我收到有关未定义Collection model的{​​{1}}的错误。查看this question about a similar problem,我已经检查了模型实际上是在集合实例化之前创建的,尽我所能。

在从服务器获取数据并尝试使用数据中的值列表prototype集合reset集合之后,Marionette CompositeView的一个事件处理程序中抛出了错误。填入其中。

注意:使用Backbone 0.9.10

模型

MyItemModel = Backbone.Model.extend({});

收藏

MyCollection = Backbone.Collection.extend({
    model: MyItemModel
});

CompositeView的相关代码

MyCompositeView = Backbone.Marionette.CompositeView.extend({

    initialize: function(options) {
        _.bindAll(this);
        this.model = new MyCompositeViewModel();
        this.collection = new MyCollection();
    },

    //This event handler gets properly fired and run.
    on_event: function() {
        var that = this;

        // The data comes through fine with this `fetch`
        this.model.fetch({success: function() {
            var collection_results= that.model.get("collection_results");

            // The error fires in this line
            that.collection.reset(collection_results);
            that.render();
        });
    }
})

错误

当为模型对象执行add时,在Backbone的get函数中发生错误,检查它是否重复。失败的代码在这里:

// Get a model from the set by id.
get: function(obj) {
    if (obj == null) return void 0;

    // The error originates from this line
    this._idAttr || (this._idAttr = this.model.prototype.idAttribute);
    return this._byId[obj.id || obj.cid || obj[this._idAttr] || obj];
},

this._idAttr || (this._idAttr = this.model.prototype.idAttribute);

此处,this.model.prototype.idAttribute失败,因为未定义模型的prototype

为什么会发生这种情况,如何解决?

非常感谢!

1 个答案:

答案 0 :(得分:5)

原因是,在Babkbone 0.9.10中,如果你在没有选项的情况下调用collection.reset(models),模型将被传递给collection.add(),其中严格需要真实模型作为参数。

但事实上,你传递的论据并不是真正的模型。它们只是一个哈希属性数组。

要修复的两个选项:

选项1:使用解析选项

调用重置
that.collection.reset(collection_results, {parse: true});

然后reset将解析哈希数组并将它们设置为模型。

选项2:升级到最新版本Backbone 1.1.0。

此处reset()不再对add()承担责任,而是巧妙地使用set()。建议使用此选项。你不需要这里的选择。

that.collection.reset(collection_results)

另一点

我建议你不要在CompositeView中定义model吗? CompositeView用于集合,而不是模型。当然我理解这里的模型只是为了保存和获取一些数据,但是对于其他开发人员读取的代码以及你自己的维护来说真的很困惑。

要获取自举数据,您可以在第一次请求时加载数据,并使用传统方式将其收集。 http://backbonejs.org/#FAQ-bootstrap