6

jQuery ウィジェットのラッパーとして機能する Knockout バインディングを作成しています。このウィジェットは、イベント ハンドラーを子要素に適用します。残念ながら、ウィジェットのイベント処理は子要素に直接適用され、委譲されません。問題は、同じ要素にバインディングがあることですが、バインディングが適用された後foreachにカスタム バインディングを適用する必要があります。foreach

明らかに、jQuery プラグインを修正するのが正しいことですが、現時点ではこれはオプションではありません。私にとって良い回避策のオプションがあるかどうか疑問に思っています。たとえば、次のいずれかを行う方法はありますか?

  1. 特定のバインディングが適用されているかどうかを検出する
  2. 拘束力のあるアプリケーションの順序に影響を与える
  3. 別のバインドを安全に強制する

アップデート:

1 つの側面として、このカスタムとforeachバインディングがテンプレートに存在するということを説明しておく必要があります。したがって、実際にテンプレートを変更するため、DOM を直接変更するソリューションは機能しません。

4

3 に答える 3

7

依存関係の配列を使用して bindingHandler に after プロパティを追加します

ko.bindingHandlers.myHandler = {
    init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        // Actual code
    },
    update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        // Actual code
    },
    after:['foreach']
};
于 2014-09-03T16:33:57.420 に答える
3

バインディングが foreach バインディングに依存している場合、カスタム バインディングから呼び出してみませんか? その後、データバインド属性でそれを提供する必要さえありません。先日、別の SO ユーザーを支援しました。カスタム バインディング内からオプション バインディングを呼び出す方法を確認してください。

http://jsfiddle.net/w9bsc/42/

ko.applyBindingsToNode(element, { options: valueAccessor(), optionsCaption: caption, optionsText: optionsText  }, viewModel);
于 2012-12-25T00:03:09.107 に答える
2

回避策を見つけましたが、それは私が好むよりもハックです。私はまだより良い答えを待ちます。

私がしたことは単にこれでした:

ko.bindingHandlers.myHandler = {
    init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        if (allBindingsAccessor().foreach) {
            setTimeout(doInit, 1);
        } else {
            doInit();
        }

        function doInit() {
            bindingContext.initializedMyHandler = true;
            // Actual code
        }
    },
    update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        if (bindingContext.initializedMyHandler) {
            doUpdate();
        } else {
            setTimeout(doUpdate, 1);
        }
        function doUpdate() {
            // Actual code
        }
    }
};

基本的に、タイムアウトを使用して実行を延期するだけです。そうすれば、残りのバインディング ハンドラが最初に実行されます。

于 2012-12-24T22:52:34.397 に答える