2

バックボーン コレクション 0.9.9 - 追加イベントが機能しない バックボーンを 0.9.9 に更新した後、(追加) で問題が発生しました。

(function () {


var Model = Backbone.Model.extend({

    initialize: function () {
        console.log('initialize Model');
    }
});


var Collection = Backbone.Collection.extend({

    model: Model,
    url: "/json.json",

    initialize: function () {
        console.log('initialize Collection');
    }
});

var View = Backbone.View.extend({

    initialize: function () {
        console.log('initialize View');
    }
});


var collection = new Collection([
    {
        "id"    : "001",
        "name"  : "Дарья",
        "text"  : "1 Вопрос - Ответ 1"
    }
]);

collection.on('add', function () {
    console.log('edd event', this)
});

collection.fetch({
    add: true,
    //silent: false,
    success: function (model) {
        console.log('fetch')
    }
});


}());

console.log('edd event', this) - 動作しません (古いバージョンでは動作します)

4

3 に答える 3

3

addオプション tocollection.fetchはサポートされなくなったようです。

0.9.2 ソース (collection.fetch) から:

collection[options.add ? 'add' : 'reset'](collection.parse(resp, xhr), options);

0.9.9 ソース (collection.fetch) から:

var method = options.update ? 'update' : 'reset';
collection[method](resp, options);
if (success) success(collection, resp, options);

したがって、デフォルトcollection.fetchではコレクションがリセットされ、resetイベントが発生します。オプションを渡すupdate:trueと、 andupdateが実行されます。

新しい collection.update メソッドのドキュメントによると、 update はadd追加されたモデルのイベントをトリガーするため、次のように動作するはずです。

collection.fetch({
    update: true,
    success: function (model) {
        console.log('fetch')
    }
});

モデルが削除または変更された場合、新しい update メソッドもトリガーremoveおよびイベントすることをテストして注意してください。change

于 2012-12-14T12:36:49.390 に答える
1

コメントされたアウトライン行は、追加イベントを伝播しないため、削除する必要があります(backbone.jsソースの行827を参照)。したがって、以下が機能するはずです

collection.fetch({
    add: true,
    silent: false,
    success: function (model) {
        console.log('fetch')
    }
});

それが以前のバージョンからの変更かどうかはわかりません:)

于 2012-12-14T12:27:07.923 に答える
1

Backbone 0.9.9 のソースをチェックアウトして収集したものから、 - オプションも追加しない限り、 - オプションaddは何もしません。ソースfetchupdate

したがって、それを使って何か便利なことをするには、次のようにします。

collection.fetch({
    add: true,
    update: true, // this is necessary as well
    //silent: false,
    success: function (model) {
        console.log('fetch')
    }
});

これが問題の原因でもあります。フェッチすると、フェッチ後Collectionに -function が自動的にデフォルトになりresetます。-events をreset無音にし、Backbone.jsソースから明らかなように、イベントをトリガーするだけを選択しますaddreset

if (models) this.add(models, _.extend({silent: true}, options));

したがって、 -events が必要で、新しいモデルを追加する前にコレクションを空にしたくないupdate場合は、このオプションを使用してください。addリセット機能とaddイベントが必要な場合は、 のカスタム実装を作成する必要がある場合がありますreset

于 2012-12-14T12:59:20.547 に答える