6

のインスタンスである 2 つのモデル (ユーザーとタスク) がありますBackbone.RelationalModel

この 2 つのモデルの関係は次のとおりです。

// Task model

    var Task = Backbone.RelationalModel.extend({

        relations: [
            {
                type: 'HasOne',
                key: 'user',
                relatedModel: User
            }
        ],

        urlRoot: 'someUrl'

    });

次に、コードが次のようなコレクションを 1 つ持っています。

var FollowerCollection = Backbone.Collection.extend({
    initialize: function () {
         _.bindAll(this);
    }
    model: User
});


var User = Backbone.RelationalModel.extend({

});

FollowerCollection でフェッチを行うと、次のエラーが発生します。

 Uncaught TypeError: Cannot read property 'idAttribute' of undefined

backbone-relation.js の 1565 行目backbone-relation version 0.5.0


backbone-relation.js のコードの一部

if ( !( model instanceof Backbone.Model ) ) {
    // Try to find 'model' in Backbone.store. If it already exists, set the new properties on it.
       var existingModel = Backbone.Relational.store.find( this.model, model[ this.model.prototype.idAttribute ] );

_.bindAll(this)コメントすると正常に動作するため、問題は関連しています。
なんで?何か案は?


4

2 に答える 2

3

_.bindAll を削除しても機能します。

とても便利な機能なので残念です。バックボーンの一部とひどく相互作用する必要があります。私はv9.10を使用しています

私は常にこの方法を使用していますが、問題が時々発生するだけです (コレクションに一括追加したい場合など)。

私にとって、問題はこの Backbone.js メソッドにありました。

// Get a model from the set by id.
get: function(obj) {
    if (obj == null) return void 0;
    this._idAttr || (this._idAttr = this.model.prototype.idAttribute);
    return this._byId[obj.id || obj.cid || obj[this._idAttr] || obj];
},

this.model.prototypeプロトタイプが定義されていないため、コードは失敗します。何?Y A。本物のために。

問題は、_.bindAll が呼び出されると、@jakee が言うように、コレクションのすべてのプロパティをバインドすることです。これには Collection.model が含まれているようですが、これはバグだと思います。

解決策は、これが修正されるまで個々のメソッドをバインドすることです。

github には既存のクローズされた問題があります: https://github.com/documentcloud/backbone/issues/2080 現在のメンテナーはこの方法を好まないようですが、その理由はわかりません。

于 2013-02-20T03:21:39.137 に答える