2012-12-24 14 views
5

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

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

  1. 安全

場所を取るために別の結合を強制結合アプリケーション

  • の順序に影響を与える特定のバインディングが
  • を適用されているかどうかを検出アップデート:

    一の態様Iこのカスタムおよびforeach結合が鋳型に存在することが言及されるべきである。したがって、実際にテンプレートを変更するため、DOMを直接変更するソリューションは私のためには機能しません。

  • 答えて

    2

    バインディングがforeachバインディングに依存している場合は、カスタムバインドから呼び出すのはなぜですか。それでは、データバインド属性で指定する必要はありません。私は、依存関係の配列を使用してbindingHandlerのプロパティの後に追加

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

    ko.applyBindingsToNode(element, { options: valueAccessor(), optionsCaption: caption, optionsText: optionsText }, viewModel); 
    
    +0

    あなたの答えをありがとう。私は実際に( 'applyBindingsToNode'を使って)あなたがしたことを試しました、そして、それは動作するようです。先ほど言及しなかった複雑な問題の1つは、私のカスタムバインディングが 'text/html'テンプレートに適用されていたことです。 'foreach'を使って' applyBindingsToNode'を実行した後、子ノードは作成されましたが、テンプレートのDOMに永久に挿入されました。 – Jacob

    +0

    あなたはforeachではなく、あなたがやったことのためにテンプレートバインディングを使うべきですか? – Anders

    +0

    私は両方を試しました。どちらの方法でも、 'applyBindingsToNode'はテンプレートの内部でDOMを変更しました。 – Jacob

    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 
         } 
        } 
    }; 
    

    基本的に私はタイムアウトを使用して実行を延期:私は何

    は単純に、このでした。こうすることで、残りのバインディングハンドラが最初に実行されます。

    7

    を結合するカスタムの中から結合オプションを呼び出す方法を確認し、他の日別のSOユーザーを助けた

    ko.bindingHandlers.myHandler = { 
        init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
         // Actual code 
        }, 
        update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
         // Actual code 
        }, 
        after:['foreach'] 
    }; 
    
    +0

    これはうまくいかないようです - あなたはいくつかのドキュメントへのリンクを持っていますか? –

    +1

    [はい私は](http://jsfiddle.net/2uaLxdrk/8/) – DrSammyD

    +0

    面白い - ありがとう。確かにそれはノックアウトコードにあります。なぜ私はそれを試したときに動作しませんでしたか分からない。 –

    関連する問題