0

我想知道在使用骨干集合时是否应该记住什么?我基本上有一个模型,我的集合定义为:

LibraryPreps = (function () {
    return Backbone.Collection.extend({
        model: LibraryPrep,
        url: '/api/platform',
        initialize: function (models, options) {

        }
    });
})();


LibraryPrep = (function () {
    return Backbone.Model.extend({

        defaults: {
            name: '',
            platform: '',
        },
        initialize: function () {
            return this;
        }
    });
})();

他们没什么好看的。当我创建一个 LibraryPrep 并记录它时,它看起来就像我想要的数据。但是当我尝试将它添加到集合中时,我收到了这个错误:

TypeError: this.model is undefined
followed by this line of code:
this._idAttr || (this._idAttr = this.model.prototype.idAttribute);

我基本上是这样做的:

var libPreps = new LibraryPreps();

            _.each(libraries, function (library) {
                console.log("POPULATE LIBRARY PREP");
                console.log(library);
                var tempLibPrep = new LibraryPrep(library);
                console.log(tempLibPrep);

                libPreps.add(tempLibPrep);    // why aren't you working?!
            });

我以前在其他地方使用过一个集合,我似乎从来没有遇到过问题。我对网络还是很陌生,所以也许有一些我没有想到的东西。有什么想法吗?提前致谢 :-。

4

2 回答 2

2

看看,LibraryPreps.prototype你会发现你哪里出错了。首先,你的真实代码必须看起来更像这样,否则你会得到ReferenceError

var LibraryPreps = (function () { ... })();
var LibraryPrep  = (function () { ... })();

当产生的匿名函数LibraryPreps执行时,LibraryPrep将是未定义的,因为它直到稍后才被赋值。如果你这样做:

var LibraryPreps = (function () {
    return Backbone.Collection.extend({
        model: LibraryPrep,
        //...
    });
})();
var LibraryPrep = (function () {
    return Backbone.Model.extend({ /*...*/ });
})();
console.log(LibraryPreps.prototype);

您会在控制台中看到LibraryPreps.prototype.modelis 。undefined演示:http: //jsfiddle.net/ambiguous/y8cja/

Backbone.Collection.extend调用(带有或不带有匿名自执行函数包装器)强制在调用LibraryPrep时进行评估,extend因此您最终构建了一个带有undefined model属性的集合“类”。然后,在 Backbone 中,它会寻找idAttribute集合模型的 ,然后你会得到错误。

修复定义的顺序,以便在使用之前定义事物:

var LibraryPrep  = (function () { ... })();
var LibraryPreps = (function () { ... })();

你会有更好的结果。


正如Loamhoof在评论中指出的那样,您的代码在当前版本的 Backbone (1.0.0) 上运行良好,我找不到这个:

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

1.0.0 源中的任何位置。大概您使用的是旧版本的 Backbone,其Collection#add方法需要知道idAttribute其模型的属性。

于 2013-04-20T23:53:18.517 回答
0

您是否尝试将模型直接添加到集合中?

libPreps.add(libraries); 

http://backbonejs.org/#Collection-add

addcollection.add(models, [options]) 将模型(或模型数组)添加到集合中,触发“add”事件。如果定义了模型属性,您还可以传递原始属性对象,并将它们激活为模型的实例。传递 {at:index} 将模型拼接到指定索引处的集合中。如果您将模型添加到集合中已经在集合中的模型,它们将被忽略,除非您传递 {merge: true},在这种情况下,它们的属性将被合并到相应的模型中,触发任何适当的“更改”事件。

于 2013-04-20T23:21:47.050 回答