2012-02-23 6 views
10

をアンラップする必要があり、私はそれが否定された場合に値バインディングKnockoutJSに動作しないことに気付きましたknockoutjsでバインド値を否定ん:はなぜ

をとても似:

data-bind="showTip: enableTip, css: { disabled: !addButtonEnabled }" 

doesnの」否定されたaddButtonEnabled変数を正しくピックアップします。

はしかし、これは動作しません:

data-bind="showTip: enableTip, css: { disabled: !addButtonEnabled() }" 

なぜそれが他にはないところ、これはアンラップしなければならないことですか?

私はknockout 1.2.1を使用しています。

答えて

15

あなたの例でKOがバインディングを解析する方法を少し説明しましょう。

実際、data-bindにはJSONが含まれています。 KOはそれを{}記号で囲み、通常のJSコードとして評価します。あなたの例KOで は、評価後にこのオブジェクトを得ました:

{ 
    showTip: enableTip, 
    css: { disabled: !addButtonEnabled } 
} 

css bindingHandlerがするとbindingAccessor機能適用されるべき結合ノードを受け取ります。

この関数の評価後、cssバインディングの「引数」が得られます。これは、対応するスタイルを設定するには、このオブジェクトのプロパティを介して次にcss bindingHandler反復を

{ disabled: !addButtonEnabled } 

をオブジェクトと等価です。 disabledのプロパティについては、値を読み取る必要があります。

通常、すべての標準バインディングは、この方法で値を読み取ります。ko.utils.unwrapObservable(value)valueを返します。valueがこの観察可能変数に格納されていない場合は値を返します。

あなたの場合value = !addButtonEnabled。あなたが見ることができるように、!addButtonEnabledはJavaScript式であり、観察できません。だから、この式を評価するだけです。実際にはボタンは常にobservable() != false以降に有効になっています。

評価される値にはobservableの値が含まれているため、正しく動作します。

私はあなただと思います

+0

非常に便利です。ありがとうございました! – GRGodoi

+0

私はこれが古いことを知っていますが、私は 'disabled:observable1 || observable2'ではunwrapされたオブザーバブルのいずれも必要ありませんが、私は彼らがあなたの答えで与えたのと同じ理由ですべきだと期待しています - バインディングは単にobservableでなくjavascript式です。 – xdumaine