1

私は自分のビューの中でこれをやっています:

render: function($options) {
    ...

    this.collection.on('reset', _(function() {
        this.render($options);
    }).bind(this));

    ....
}

問題は、reset再レンダリングがトリガーされるたびに、新しいresetバインドが作成され、その結果、再レンダリングが 2 回、4 回、8 回などの回数発生することです。

バインドを初期化セクションに移動するのは少し難しいですが (これでこの問題は解決します)、オプションではないため、このイベントが以前にバインドされているかどうかをバックボーンに確認させるなど、他の解決策はありますか?

4

4 に答える 4

2

バインディングをに移動するのinitializeが最善ですが、そうしない正当な理由があると仮定すると、フラグを設定することができます:

initialize: function() {
    var _this = this;
    this._finish_initializing = _.once(function($options) {
        _this.collection.on('reset', function() {
            _this.render($options);
        });
    });
    //...
},
render: function($options) {
    this._finish_initializing($options);
    //...
}

フラグを実装するにはさまざまな方法がありますが_.once、フラグのチェックをうまく隠しています。render自分自身をバインド解除するリスナーを使用して、イベントをトリガーすることもできます。

initialize: function() {
    var finish_initializing = function($options) {
        /* your binding goes here ... */
        this.off('render', finish_initializing);
    };
    this.on('render', finish_initializing, this);
},
render: function($options) {
    this.trigger('render', $options);
    //...
}

それは本当に同じ論理で、別の服を着ているだけです。また、明示的なフラグとifinを使用するか、 inrenderに関数を割り当てて、その関数を使用することもできます。this._finishinitializedelete this._finish

于 2012-09-13T04:48:47.257 に答える
0

まず、イベント ハンドラー関数を名前付き関数として定義します。

var self = this;
var onReset = function() {
    self.render($options);
}

次に、 render が呼び出されるたびに関数を防御的にバインド解除します

this.collection.off('reset', onReset);
this.collection.on('reset', onReset);
于 2012-09-13T04:31:44.687 に答える
0

私は最近、JavaScript変数を使用してこれを達成しました。

関数の外では、次のように宣言しました。

var boundalready =0

次に、関数内で次のようにします。

if (boundalready == 0){
      boundalready = 1;
      bind(this);
    };

これは私にとってはかなりうまくいきました。

于 2012-09-13T06:00:51.973 に答える