我遇到了这种情况,当下拉从可计算的KO属性更改时,下拉的绑定值observable不会自动同步。 这是一个有点棘手,因为下拉列表是从另一个下拉列表中选择一个值填充,而是为了使这更清楚我创造了这个测试捣鼓这表明了问题:https://jsfiddle.net/n3wjack/gzmb792p/KO绑定值与下拉不同步
这里是如何模拟问题:
- 在宠物下拉列表中,选择John的第二只宠物“Mozart”。你会看到'selected宠物'标签更新。
- 现在在第一个下拉列表中选择简。第二个下拉列表将更新,显示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>
你应该使用'options'结合,而不是'的foreach '。 –