2017-01-04 8 views
5

私はビューモデルを作成するためにdurandalとrequirejsを使用しています。私はまた、ビューから離れて移動するたびに、構成ライフサイクルコールバックメソッドdeactivateに接続しています。私はこの方法で私のビューモデルを処分したい。無効化後にDurandalでビューモデルを処理する方法

私はdelete thisthis = undefinedを試しましたが、動作していないようです。私もこのようなデュランダルイベントアグリゲータを使用しています

self.activate =() => { 
     App.trigger("testEvent"); 
    }; 

    App.on("testEvent").then(() => 
    { 
     alert('Event Triggered!'); 
    }); 

のviewmodelがロードされるので、毎回、イベントがトリガされます。今、もし私が離れてビューからナビゲートし、次に戻る(したがって、ビューモデルが再びロードされます)、イベントは2回トリガされます。 3回目のビューに移動すると、そのイベントは3回トリガされます。したがって、以前のビューモデルはまだ存在しています。そのため、各ビューモデルによってdurandalイベントがトリガーされています。したがって、この問題を解決するには、ビューモデルを無効にする必要があります。どのようにすればいいですか?

注。問題のビューモデルはシングルトンではなく一時的なものです。

答えて

2

Durandalは、ビューがDOMに添付されている場合にのみトリガーを取得する「接続」ライフサイクルフックも提供します。イベントの購読をここに置く場合は、一度購読するだけです。

http://durandaljs.com/documentation/Hooking-Lifecycle-Callbacks

EDIT:

限り、サブスクリプションからの戻り値を保存する場合は、あなたが非アクティブ化の後の.off電話またはデタッチ方法

var subscription = App.on("testEvent"); 
... 
subscription.off(); 
することができます行くイベントから退会など

http://durandaljs.com/documentation/Leveraging-Publish-Subscribe.html

viewmodel自体は単なる管理されたjavascriptオブジェクトであり、削除されますそれへのすべての参照が消えたら自動的に削除されます。

+0

登録を解除するとそのトリックが行われたようです。私のイベントはもはや複数回呼び出されません。自分のビューモデルが処分されたかどうかを実際に確認する方法はありますか、それとも気にしないでしょうか? – Viqas

+0

何百ものビューモデルをインスタンス化していない限り、おそらく努力する価値はありませんが、Chromeデベロッパーツールを使用して、ガベージコレクタがオブジェクトを正常にクリーンアップしていることを確認するためにJavaScriptオブジェクトのカウントとメモリ割り当てを監視できます。 –

1

イベント 'testEvent'に登録していますが、退会していないため、あなたのビューモデルへの参照が保持されている可能性があります。私はそれがjavascriptで処分する方法の専門家ではありませんが、ネットで同様のシナリオに遭遇しました

あなたのイベントは3回トリガされませんが、1回トリガされますが、イベントハンドラ関数は3回のナビゲーションの後、サブスクリプション3回。

無効化メソッドで登録を解除して、有効になっているかどうかを確認してください。これは少なくとも、イベントハンドラの起動を3回停止します。私はあなたのビューモデルを正しく処分するかどうかは確かではありません。

関連する問題