ドロップダウンが計算可能なKOプロパティから変更されたときに、ドロップダウンのバウンド値観測値が自動的に同期されないこのケースが発生します。 ドロップダウンが別のドロップダウンリストで選択した値から移入されたが、私は、問題を示し、このテストフィドルを作成し、これはより明確にするためので、それは少しトリッキーです:https://jsfiddle.net/n3wjack/gzmb792p/KOバウンド値がドロップダウンと同期しない
は、ここで問題をシミュレートする方法は次のとおりです。
- ペットのドロップダウンで、Johnの2番目のペットである「Mozart」を選択します。 「選択したペット」ラベルの更新が表示されます。
- 最初のドロップダウンでJaneを選択します。 2番目のドロップダウンが更新され、ジェーンのペットが表示されます。
選択したペットラベルはです。にはJaneの最初のペットの名前が表示されません。 ペットのドロップダウンに変更を加えると、値が再び更新されます。 ユーザーがこれを行うことを保証できないため、値が正しいかどうかわかりません。
どうすればこの問題を解決できますか、何が間違っていますか?
-
また、以下のコードも含まれているため、必要なのは明らかです。
JS:
var petOwners = [
{ name: "John", pets: ["Blacky","Mozart"] },
{ name: "Jane", pets: ["Polly", "Felix"]}
];
var viewModel = {
availableOwners: ko.observableArray(petOwners),
selectedOwner: ko.observable(),
selectedPet: ko.observable()
}
viewModel.availablePets = ko.computed(function(){
console.log("** availablePets computed **")
var result = [];
if (viewModel.selectedOwner())
{
console.log(viewModel.selectedOwner());
result = viewModel.selectedOwner().pets;
}
console.log(result);
return result;
}, this);
viewModel.peekPet = function(){
document.getElementById("peekoutput").innerHTML += "selectedPet = " + viewModel.selectedPet.peek() + "</br>";
}
ko.applyBindings(viewModel);
はHTML:
<select data-bind="foreach:availableOwners, value:selectedOwner">
<option data-bind="text: name, value: $data"></option>
</select>
<i>
(selected: <span data-bind="text: selectedOwner().name"></span>)
</i>
<p>
This dropdown shows the pets of the owner, selected in the above dropdown.
</p>
<select data-bind="foreach:availablePets, value: selectedPet">
<option data-bind="text: $data, value: $data"></option>
</select>
<p>
<i>
Selected pet: <span data-bind="text: selectedPet"></span>
</i>
</p>
<p>
The selected pet however doesn't update to be in sync with the first pet in the dropdown, when you change the owner dropdown. :(
</p>
<p>
<button data-bind="click: peekPet">Peek selected pet</button>
</p>
<code id="peekoutput">
</code>
あなたはむしろforeachの ''よりoptions'バインディングを使用する必要があります'。 –