0

モデルが最初にフェッチされたときにモデルのビューをレンダリングしたいのですが、すべての変更ではありません。

私のセットアップは次のとおりです。

var m = new $.model.Customer({id: customer});
var v = new $.view.GeneralEditView({el: $("#general"), model: m});
m.fetch();

次に、ビューの初期化で、変更イベントを render メソッドにバインドして、モデルが読み込まれたときにレンダリングします。

this.model.bind('change', this.render);

問題は、変更のたびにビューがレンダリングされることです。フェッチ後にのみレンダリングしたいと思います。残念ながら、変更以外のモデルのフェッチ後に発生するイベントを認識していません。

バインドできるコレクションの「リセット」のようなものはありますか?

編集:

もっと簡潔に言うと、バックボーン モデルの場合、モデルがサーバーからロードされたときとローカルで変更されたときを区別する方法はありますか?

4

3 に答える 3

1

モデル

changeuniqueId (ある場合) など、特定のキーの変更に固有のイベントを作成できます。

this.model.bind('change:id', this.render, this);

デフォルトでfetchは、イベントを直接発生させることはありませんが、change新しいデータが読み込まれるとイベントを間接的に発生させます。set

fetchそれができない場合は、いつでも関数でイベントをトリガーできます。

initialize: function () {
    this.model.bind("fetch", this.update, this);
}

fetch: function () {
    // do stuff
    this.model.trigger("fetch", this);
}

update: function () {
    // your refresh stuff here
}
于 2012-08-20T13:07:22.927 に答える
1

これにアプローチするには、さまざまな方法があります (これらはすべてvar view = this;、ビュー コードのどこかにあることを前提としています)。

  • .fetch()1 回限りの成功のコールバックで呼び出します。

    m.fetch({
        success: function() {
            view.render();
        }
    });
    
  • changeハンドラーにバインドしますが、バインドを解除します。

    function handle() {
        view.render();
        view.model.off('change', handle);
    }
    this.model.bind('change', handle);
    
  • _.onceハンドラー呼び出しを制限するために使用します。

    this.model.bind('change', _.once(function() {
        view.render();
    }));
    
  • .ready()モデルのパターンを使用してください -ここに例があります。複数のビューがモデルがいつ読み込まれたかを知る必要がある場合や、モデルがまだ読み込まれているかどうかを気にせずに同じコードを記述できるようにする必要がある場合に、このオプションが気に入っています。.isFullyLoaded()これの欠点は、毎回テストするようなモデル メソッドを追加する必要があることです。利点は、フラグを設定するのではなく、テスト関数を使用することで、コードを変更することなく、コレクションの一部としてモデルを一括でロードできることです。

于 2012-08-20T17:38:55.257 に答える
0

https://github.com/documentcloud/backbone/pull/1468#issuecomment-6766096から一般的な解決策があるかもしれません。Backboneのsyncメソッドを次のように上書きしました。

Backbone.Model.prototype.sync = function(method, model, options) {

    var succ = options.success;
    var customSuccess = function(resp, status, xhr) {
         //call original
        succ(resp, status, xhr);
        model.trigger('synced', model, options);
    }
    options.success = customSuccess;
    Backbone.sync(method, model, options);
 }

元の成功メソッドを保存するには、必要がない限り、それを台無しにしたくないので、カスタム成功メソッドを渡します。カスタム成功メソッドが呼び出されると、@ Austinによって提案されたようにカスタムイベントがトリガーされ、次に元の成功メソッドが呼び出されます。

于 2012-08-20T14:50:17.293 に答える