2

いくつかのイベント処理にBackbone.jsを使用したいのですが、循環参照とメモリ管理に自信がありません。EventStationという静的イベントソースがあるとしましょう。つまり、スクリプトの最初に次のように言います。

var source = new EventSource();

sourceページの存続期間中生きることを意味し、それは問題ありません。今、私にはイベントコンシューマーもいます:

var EventConsumer = Backbone.Model.extend({
    initialize: function(params) {
        source.on("some_event",this.onSomeEvent,this);
    }
});

function later() {
    var consumer = new EventConsumer();

    // consumer now gets leaked... (I think)
}

ある時点で電話をかけますlater()が、最後に、の内部を調べてみる場合を除いて、消費者にアクセスできなくなりますsourceEventConsumerに新しい関数を追加する必要があると思います。

cleanup: function() {
    source.off("some_event",this.onSomeEvent,this);
}

そして、の終わりにそれを呼び出しますlater()

これは...私が望むほどきれいではないようです。これをより良くする方法はありますか?DOMイベントを使用している場合、これは別の方法で処理されますか?

4

1 に答える 1

5

これを読む:

http://lostechies.com/derickbailey/2011/09/15/zombies-run-managing-page-transitions-in-backbone-apps/

特にビューについて説明しますが、すべてのイベントバインディングオブジェクトに適用されます。

またこれ:

Backbone.js:ビューを再作成または再作成しますか?

「bindTo」メソッドと「unbindAll」メソッドを使用してイベントのバインドとバインド解除を管理するというJohnnyOshikaのアイデアは素晴らしいものです。イベントを管理するオブジェクトでこれらのメソッドを使用することを強くお勧めします。

これの実装が必要な場合は、Backbone.Marionetteフレームワークに組み込まれています。

https://github.com/derickbailey/backbone.marionette/blob/master/src/backbone.marionette.bindto.js

このコードはMITライセンスのオープンソースであるため、自由にコピーしてどこでも使用できます...この機能を取得するためだけにMarionetteを使用する必要はありません。

BindToオブジェクトを使用するには、それを独自のオブジェクトに拡張します。


var source = _.extend({}, Backbone.Marionette.BindTo);

またはプロトタイプとして使用します。


var source = Object.create(Backbone.Marionette.BindTo);

次に、イベントソースを最初のパラメーターとして渡すイベントをバインドし、その後のすべての標準バックボーンイベント引数を使用します。


source.bindTo(myObj, "some_event", this.doStuff, this);

そして、すべてをアンバインドするには、


source.unbindAll();

私の実装のドキュメントはここにあります:

https://github.com/derickbailey/backbone.marionette/blob/master/docs/marionette.bindto.md

于 2012-07-06T01:51:30.240 に答える