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.modelundefinedコンソールに表示されます。デモ: http://jsfiddle.net/ambiguous/y8cja/

Backbone.Collection.extend呼び出し (匿名の自己実行関数ラッパーの有無にかかわらず) が呼び出されたときに が強制的にLibraryPrep評価さextendれるため、プロパティを持つコレクション「クラス」を構築することになりundefined modelます。次に、バックボーン内でコレクションのモデルを探しidAttribute、エラーが発生します。

定義の順序を修正して、使用する前に物事が定義されるようにします。

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

より良い結果が得られます。


コメントでロームフーフが指摘しているように、あなたのコードは現在のバージョンのバックボーン (1.0.0) で正常に動作しますが、これが見つかりません:

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

1.0.0 ソースのどこかに。おそらく、古いバージョンの Backbone を使用しており、そのメソッドはそのモデルのプロパティCollection#addを知る必要があると思われます。idAttribute

于 2013-04-20T23:53:18.517 に答える