1

次のように、ウィジェットのコントローラー コードにいくつかの setInterval 値を設定しています。

define(['durandal/widget'],function (widget) {
    var count = 0;
    var intervals = [],
        ctor = function (element, settings) {
               this.settings = settings;
        };

    ctor.prototype.updateCount = function( ){
            var interval = setInterval(function () {
            count = count + 1;
            return count;
            }, 1000);
            intervals.push(interval);
          }   
    return ctor;
}

上記のコードは、次のようなビュー内の forEach ループ内で実行されています。

<div data-bind="foreach: {data: settings.items}">
 <span class="count" data-bind="text:$parent.updateCount()"></span>
</div>

私がやりたいのはclearInterval、ウィジェットが破棄されたとき、または基本的に dom から削除されたときに、intervals 配列内のすべてのアイテムに対してメソッドを呼び出すことです。ビューモデルの非アクティブ化を使用してこれを実行できることはわかっていますが、再利用性の観点から、ウィジェット自体で間隔のクリアを処理したいと考えています。Durandal のウィジェット モジュールでこれを達成する方法はありますか。

4

2 に答える 2

0

ウィジェットが JQuery の「削除」機能で削除されている限り、この「削除」機能にカスタム イベント ハンドラーを追加すると、次のようになります。

var self = this;
var self.count = 0;
var self.intervals = [];
self.ctor = function (element, settings) {
    $(element).on("remove", function () {
        $.each(self.intervals, function(index, ival) { 
            clearInterval(ival); 
        });
    });
    this.settings = settings;
};

問題は、JQuery を使用せずに DOM を操作するだけでウィジェットを削除すると、イベントが発生しないことです。その後、 DOMNodeRemovedイベントのコードを実装できますが、IE では機能しません...

編集: 1.9.1 より前の JQuery を使用している場合は、この質問に対する他の回答を確認することをお勧めします。

于 2013-04-29T16:59:21.387 に答える