バインディングを使用して複雑な JavaScript オブジェクトのリストにバインドされたselect
要素があります。options
<select data-bind="options: availableCountries, optionsText: 'countryName', value: selectedCountry, optionsCaption: 'Choose...'"></select>
ここで、availableCountries は JavaScript オブジェクトの監視可能な配列です。このフィドルで完全な例を見ることができます。
これで、リスト内の項目を選択するとうまくいきます。ただし、アプリケーションの他の部分から値を更新する必要がある場合は、availableCountries 配列にあるものとまったく同じ Country オブジェクトを使用する場合にのみ更新できます。これはこの関連する質問でも確立されていますが、残念ながら私の問題は解決しません。
options bindingのドキュメントでは、彼らはこの問題を予期しており、optionsValue
バインディングを使用する必要があると述べています。
通常、使用可能なオプションのセットを更新するときに、KO が選択を正しく保持できるようにする方法としてのみ、optionsValue を使用する必要があります。たとえば、Ajax 呼び出しを介して「車」オブジェクトのリストを繰り返し取得し、選択した車を確実に保持したい場合は、optionsValue を「carId」または各「車」オブジェクトが持つ一意の識別子に設定する必要がある場合があります。そうしないと、KO は以前の「車」オブジェクトのどれが新しいオブジェクトのどれに対応するかを必ずしも認識できません。
しかし、これは値のバインディングにも影響するため、残念ながら機能しません。 に設定optionsValue
すると'countryName'
、selectedCountry
オブジェクト全体ではなく国の名前のみが含まれます。
これらを組み合わせる方法を探しています。値をオブジェクト全体にしたいのですが、オプション値の比較では、指定した特定のプロパティを使用する必要があります。基本的に、次の行の何か:
<select data-bind="options: availableCountries, optionsText: 'countryName', optionsComparator: 'countryName', value: selectedCountry, optionsCaption: 'Choose...'"></select>
ただし、私が見る限り、これにはvalue
バインディングの変更が含まれます。他に選択肢はありますか?これを他の方法で解決できますか?エクステンダー?カスタムバインディングハンドラ?