24

簡単な質問があります。私は2行のコードを持つ関数を見ています:

deleteTask: function() {
    this.parent.collection.remove(this.model);
    this.model.destroy();
}

コレクションからモデルを削除することになっている最初の行をコメントアウトすると、意図したとおりに機能しているように見えます(モデルは自動的に削除されます)。BackboneのWebサイトから、これはモデルの「破棄」機能に関連する説明です。

モデルで「破棄」イベントをトリガーします。このイベントは、モデルを含むすべてのコレクションを介してバブルします。

の削除がthis.parent.collection.remove(this.model);コードの機能に影響を与えることはないと想定しても安全ですか?これは私が思うことですが、私はそれを確認したかったのです。

ありがとうございました!

4

2 に答える 2

36

モデルを破棄すると、そのモデルを含んでいたコレクションから削除されます。あなたはバックボーンソースでそれを見ることができます

//Internal method called every time a model in the set fires an event.
_onModelEvent: function(event, model, collection, options) {
    ...
    if (event === 'destroy') this.remove(model, options);

そうです、コレクションからモデルを明示的に削除する必要はないと思います。

しかし、私を信用しないでください、あなた自身のためにテストしてください:)

deleteTask: function() {
    that = this;
    this.model.destroy({
      success: function() {
        console.log(that.parent.collection);
      }
    });
}

モデルがコレクションから削除されたかどうかを確認するには、コンソールを自分で確認してください。

于 2013-01-14T18:52:03.240 に答える
-3

解決策は、Backboneモデルのdestroy関数をオーバーライドすることです。私はこれを成功とコールバック戦略を備えた抽象的なモデルで作成しました:

パラメータ「data」は、元のパラメータ「resp」に対応しています。

destroy: function(successCallback, errorCallback) 
{
    var options = { wait: true };
    var model = this;

    successCallback = successCallback || function() {};
    errorCallback = errorCallback || function() {};               

    var destroy = function() 
    {
        model.trigger('destroy', model, model.collection, options);
    };

    options.success = function(data) 
    {
        if ('SUCCESS' === data.responseCode)
        {
            if (options.wait || model.isNew())
                destroy();

             successCallback(data);

            if (!model.isNew())
                model.trigger('sync', model, data, options);
        }
        else
        {
            errorCallback(data);
        }
    };

    if (this.isNew()) 
    {
        options.success();
        return false;
    }

    var xhr = this.sync('delete', this, options);

    if (!options.wait)
        destroy();

    return xhr;
}
于 2013-09-19T07:23:51.927 に答える