1

オブザーバブルが更新されたときにオブザーバブルにバインドされた要素を強調表示したいのですが、オブザーバブルのバインディングが開始されたときではありません。

カスタムバインディングを使用してみました:

<div data-bind="updateHighlighting: name, text: name"></div>
<input data-bind="value: name" />

ko.bindingHandlers.updateHighlighting = {
    update: function(element, valueAccessor) {
        $(element).effect("highlight", 2000);
    }
};

var vm = {
    name: ko.observable("Diego")
};

ko.applyBindings(vm);

ただし、更新コールバックは、オブザーバブルが更新されたときだけでなく、カスタム バインディングの初期化時にも実行されます。そのため、バインディングの開始時に望ましくない要素が強調表示されます。

次のようなことを行うために、バインディングの初期段階にいる場合、更新コールバック内で知ることができますか?

ko.bindingHandlers.updateHighlighting = {
    update: function(element, valueAccessor) {
        if(!isInit)
            $(element).effect("highlight", 2000);
    }
};
4

1 に答える 1

3

簡単な方法は、次のような Knockoutsko.utils.domData関数を使用することです。

ko.bindingHandlers.updateHighlighting = {
    update: function(element, valueAccessor) {
        var key = "_my_init_key_",
            isInit = ko.utils.domData.get(element, key);

        if(isInit) {
            $(element).effect("highlight", 2000);
        }
        else {
            ko.utils.domData.set(element, key, true);
        }
    }
};

これは実際には要素に expando プロパティを設定するだけなので、それを使用して状態を維持します。API を使用する場合、Knockout は要素を削除するときにそれをクリーンアップしますが、プリミティブを保存するときは大したことではありません。

jQuery を使用しているため、 $.data を使用してフラグを格納することもできます。

于 2013-08-04T15:49:34.800 に答える