2012-02-14 3 views
0

をオーバーライド組み合わせバインディング:KnockoutJS - 私は結合しても同じ要素に結合カスタム「目に見える」を使用してテンプレートにリストアイテムを持ってお互い

<li data-bind="visible: (Applicable == 'All'), highlight: Selected().indexOf('false',0) == -1"> 

これは、ビューのすべてのバウンドメンバーをチェックしますモデル・コレクションを作成し、「適用可能」プロパティーに「すべて」の値がある場合は、リスト項目を表示可能にします。

また、カスタムメンバーシップを使用して、バインドされたメンバーの「Selected」プロパティに文字列「false」が含まれているかどうかによって、リストアイテムにクラスを適用します。

ko.bindingHandlers.highlight = { 
     update: function (element, valueAccessor, viewModel) { 
      var value = valueAccessor(); 
      ko.utils.unwrapObservable(value) ? $(element).addClass("selected", 1000) : $(element).removeClass("selected", 1000); 
     } 
    }; 

問題は、「ハイライト」は、カスタムバインディングということである結合ハイライトが発生したときに目に見える結合再表示によって隠された目に見える結合して、リストの項目を置き換える/上書きするようです。表示されたバインディングが実行されていると思われ、ハイライトのバインディングが実行され、表示されているバインディングの結果が無視されます。

私はこれを説明していただければ幸いです。

リストアイテムを表示するか非表示にするか、または表示してハイライトを適用するかを決定する1つのバインディングイベントのみを呼び出すように、表示するバインディングの機能をカスタムバインドにマージできますか?

+0

必要に応じて、2つのバインディングを組み合わせることはできます。ただし、jsFiddleで問題を再現すると便利です。あなたはそれを基にすることができます:http://jsfiddle.net/rniemeyer/dJxRW/ –

+0

こんにちはRyan、私は試して、JSフィドルで問題を再現するつもりです。私はこの問題を解決することが良いと思う。正直言って私は例を単純化して質問を書くのを簡単にしました。私の基本的な例がうまくいくはずです。私は今、2人の最大年齢を返し、MaxAgeプロパティがmaxPersonAgeより小さいリストアイテムのみを表示するように計算されたobservableを "maxPersonAge"に追加するように修正しました。しかし、私はすでにエラーが発生しています: "メッセージ:ReferenceError:maxPersonAgeは定義されていません"。 – BrightonDev

+0

JSFiddleの仕組みを理解しました。私の修正されたページへのURLはhttp://jsfiddle.net/FloatLeft/dJxRW/11/ – BrightonDev

答えて

0

バインディングハンドラの代わりに、計算されたobservableを使用して、cssクラスを追加するかどうかを判断することもできます。下のコードスニペットでは、isSelected値は計算された観測値です。

<li data-bind="visible: applicable === 'all', css: {selected: isSelected}"> 

私たちはすべてを見ることができないので、コードが何をしているのか分かりません。しかし、その1つの選択肢。もう一つは、あなたが示唆するように、バインディングハンドラを書くことです。

+0

こんにちはジョン、あなたの権利。あなたの提案は、私の縛られている問題の周りを回ります。私は徐々にクラスの適用と削除を失うが。 Theresはobviosly私のコードthatsの上に私がバイブルでできる限りそれを再構築しようとしているので、上記の問題を引き起こしている間違って何か。 – BrightonDev

関連する問題