1

ビューモデルでフィールド (「タイプ」) が変更されるたびに dom 要素を再初期化するために使用されるカスタム バインディングがあります。これは更新コールバックで定義されます。

<input type="text" data-bind="value: Value, initValueField: Type()" />

ko.bindingHandlers.initValueField = {
    update:function (element, valueAccessor, allBindingsAccessor, viewModel) {
        alert('Hello World');
    }
};

簡素化されたデモについては、このjsFiddleを参照してください。

私が理解しているように、更新が呼び出される条件の1つは次のとおりです。

カスタムバインディングの仕組み

同じ data-bind 属性の別のバインディングがトリガーされたとき。これにより、オプションが変更されたときに値などを適切に保つことができます。

私が抱えている問題は、ビューモデルの値が変更されるたびに、この更新コールバックも呼び出されることです。

だから...次のいずれかが可能ですか:

  1. バインディングの 1 つがカスタム バインディングを呼び出さないようにします。
  2. カスタム バインディング内の呼び出し元を検出します。
4

3 に答える 3

1

私はここで問題の潜在的な回避策を見つけました:

Knockout.jsパフォーマンスの落とし穴#3-すべてのバインディングが一緒に起動する

オプションは次のとおりです。

  1. バインディングを別々の要素(おそらくコンテナ要素)に配置して分割します。
  2. ポイント1と同様ですが、コンテナーレスバインディングを使用してそれらを分離します。
  3. カスタムバインディングで計算されたオブザーバブルを使用してinit、更新を手動で管理します。
于 2012-11-27T15:59:21.520 に答える
0

カスタムバインディングで引数を使用elementして、そのバインディングを呼び出すDOM要素を確認できます。テキストボックスの属性を使用してアクションを実行するかどうかを決定するカスタムバインディング内の条件については、 http://jsfiddle.net/DMLzd/7/を参照してください。idカスタムバインディングを呼び出す異なるIDのテキストボックスとボタンを追加しました。

于 2012-11-27T10:54:27.460 に答える
0

おそらく、オブザーバブルの変更を確認できます。そして、アクションを実行します。このようなもの:

(function () {
    var cache;
    ko.bindingHandlers.initValueField = {
        init:function (element, valueAccessor, allBindingsAccessor, viewModel) {
            var currentValue = valueAccessor();
            cache = currentValue();
        },
        update:function (element, valueAccessor, allBindingsAccessor, viewModel) {
            var currentValue = valueAccessor();
            if (cache !== currentValue()) {
                alert('Hello World');
                cache = currentValue();
            }
        }
    };
}());

キャッシュ変数には、オブザーバブルの古い値が格納されます。アラートは、現在の値がこの古い値と異なる場合にのみ実行されます。

作業フィドル: http://jsfiddle.net/DMLzd/6/

于 2012-11-26T16:07:30.663 に答える