ノックアウト js のデータ バインディング式は、次の 2 つの方法で記述できます。
1. <div data-bind="text: FirstName"></div>
2. <div data-bind="text: FistName()"></div>
2 番目の例の FirstName の後の 2 つの括弧に注意してください。どちらも機能しているようです。違いはありますか?
ノックアウト js のデータ バインディング式は、次の 2 つの方法で記述できます。
1. <div data-bind="text: FirstName"></div>
2. <div data-bind="text: FistName()"></div>
2 番目の例の FirstName の後の 2 つの括弧に注意してください。どちらも機能しているようです。違いはありますか?
違いがあります。
が の場合にのみ、両方ともFirstName
機能しko.observable
ます。単純な値の場合、最初のバリアントのみが機能します。
オブザーバブルはその値を直接保持しません。値へのアクセスを提供する関数です。したがって、値を取得するために呼び出す必要があります (つまり、厳密には is ですtext: FistName()
)。
しかし、ノックアウトは役に立ち、それを期待しています。したがって、自分で行わなかった場合は、オブザーバブルが呼び出されます。
これを担当するのはヘルパー関数ですko.utils.unwrapObservable()
。これはパラメーターを取り、それが監視可能な値かプレーンな値かを判断し、両方の場合にその値を返します。
Knockout は、定義するすべてのバインディングでこの関数を使用するため、Observable を自分で呼び出す ( text: FistName()
) か、ノックアウトにバックグラウンドで実行させる( ) かは問題ではありませんtext: FirstName
。
癖:
Knockout はバインディング式を解析し、単純な識別子か、より複雑なもの<binding>: <expr>
かを判断します。<expr>
状況が明確であるため、every は単純な識別子です。たとえば、knockout は自動的に適用<expr>
さFirstName
れます。unwrapObservable()
ただし、knockout<expr>
などのより複雑な場合は常に'Dear ' + FirstName
、式からカスタム関数を構築します。物事があいまいになり、次のようにオブザーバブルを自分で呼び出す必要があります'Dear ' + FirstName()
。
次の記事を読むことをお勧めします: [KnockoutJSについて知っておくべき10のこと]
記事からの引用:
ほとんどのバインディングは
ko.utils.unwrapObservable
、渡された値を呼び出します。これにより、監視可能なものと監視不可能なものの両方の値が安全に返されます。ただし、バインディングでobservableを式で使用する場合は、それを関数として参照する必要があります。同様に、コードでは、実際にオブザーバブル自体(値ではなく)を渡したい場合を除いて、通常、オブザーバブルを関数として参照する必要があります。
<div data-bind="visible: someFlag">...</div>
<div data-bind="visible: !someFlag()">...</div>