ですから、これについての私の見解は次のとおりです。
- 'オプション'のセットがあります。各オプションには、いくつかのプロパティとIDがあります
- 'items'のセットがあり、各アイテムには、オプション内のオブジェクトの1つと等しいオブジェクトを含む1つのプロパティがあります。したがって、各「アイテム」には選択された「オプション」があります。
c#やその他の高レベルの環境とは異なり、JavaScriptには平等の概念が組み込まれていません。このようなことを行うと、参照objA == objB
が等しいかどうかがチェックされます(数値や文字列などのプリミティブ型には当てはまりません)。つまり、2つの変数が実際に同じオブジェクトを参照します。たとえば、.NETでは、クラスを実装(および演算子のオーバーロード)して、2つの異なるオブジェクトが等しいと見なすことができるかどうかを判断するカスタム比較を行うことができます。IEquatable<T>
objA == objB
したがって、ノックアウトやドロップダウンなどを使用する場合、ノックアウトを一致させるには、比較するオブジェクトが実際に同じであることを確認する必要があることを覚えておくことが重要です。
あなたの場合、私はあなたのモデルを少し微調整しました。アイテムの選択オプションプロパティはSelectedOptionと呼ばれると仮定しました。
function model(options, items) {
self = this;
self.options = options;
self.items = ko.mapping.fromJS(items);
// Loop over each of the items and swap out the server-side provided option object
// with the corresponding option from the options parameter.
ko.utils.arrayForEach(self.items(), function(item) {
item.SelectedOption = ko.observable(
ko.utils.arrayFirst(self.options, function(option) { return option.Id == item.SelectedOption.Id(); })
);
});
}
ko.mappingを使用しているので、オプションとアイテムのパラメーターは、なんらかの形でプレーンなjavascriptオブジェクト(Ajax、インラインjs)として提供されていると思います。
opts = [
{ Id: 1, Name: "Option 1" },
{ Id: 2, Name: "Option 2" },
{ Id: 3, Name: "Option 3" }
];
var items = [
{ Id: 1, Name: "Item 1", SelectedOption: { Id: 1, Name: "Option 1" } },
{ Id: 2, Name: "Item 2", SelectedOption: { Id: 2, Name: "Option 2" } },
{ Id: 3, Name: "Item 3", SelectedOption: { Id: 3, Name: "Option 3" } }
];
var viewModel = new model(opts, items);
各アイテムのSelectedOptionパラメータに含まれるオプションは、optionsプロパティのオプションとまったく同じであるため、ノックアウトはそれらを比較して同等であるかどうかを比較できるようになり、バインディングで次のように使用できます。
<div data-bind="foreach: items">
<select data-bind="options: $parent.options, optionsText: 'Name', value: SelectedOption"></select>
</div>
jsfiddleでテストしてください:http://jsfiddle.net/niik/HDsKC/