Knockout.js 手动添加的选择选项会导致清除可观察值
在将选项手动添加到绑定选择元素的场景中,应用绑定后,可观察对象的原始值将丢失。如果使用选项绑定添加选项,则该值不会丢失。我已经在这里演示了效果: 编辑:请注意,我指的是select的初始创建/绑定,而不是以后向现有select添加选项 这有什么原因吗 示例代码:Knockout.js 手动添加的选择选项会导致清除可观察值,knockout.js,Knockout.js,在将选项手动添加到绑定选择元素的场景中,应用绑定后,可观察对象的原始值将丢失。如果使用选项绑定添加选项,则该值不会丢失。我已经在这里演示了效果: 编辑:请注意,我指的是select的初始创建/绑定,而不是以后向现有select添加选项 这有什么原因吗 示例代码: <!-- In this test, select options are added manually within a foreach construct. Select works as expect
<!-- In this test, select options are added manually within a
foreach construct. Select works as expected, but initial
value of observable is cleared. -->
<select data-bind="value: ChoiceA">
<!-- ko foreach: Choices -->
<option data-bind="text: Name, value: Id"></option>
<!-- /ko -->
</select>
<p>ChoiceA = [<span data-bind="text: ChoiceA"></span>]</p>
<!-- In this test, select options are added using options binding.
Select works as expected and initial value of observable is kept. -->
<select data-bind="options: Choices, optionsText: 'Name', optionsValue: 'Id', value: ChoiceB"></select>
<p>ChoiceB = [<span data-bind="text: ChoiceB"></span>]</p>
<script type="text/javascript">
var model = {
// Store the selection here. Initialised to 3. This selects
// the correct option, but the value then disappears until a
// new selection is made.
"ChoiceA": ko.observable(3),
// Store the selection here. Initialised to 3. This selects
// the correct option, and the value stays as expected.
"ChoiceB": ko.observable(3),
// The options
"Choices": ko.observableArray([
{ Id: 1, Name: "Option1" },
{ Id: 2, Name: "Option2" },
{ Id: 3, Name: "Option3" }])
};
ko.applyBindings(model);
</script>
我不明白这里的问题。如果你看一下敲除绑定的方式,你所展示的例子是完全正确的。。如果要添加选项,只需使用choices.pushnewOption 如果您设置一个值,然后覆盖它,您将遇到一个问题,但这正是敲除应该如何工作的 如果希望以不同的方式不使用Id设置值,则可以通过将对象传递到ChoiceA observable而不是Id来实现。在代码示例中,您没有指定optionValue应为I'd,但传递的Id不是所选observable ChoiceA,并且您正在破坏绑定 例如,如果将代码更改为-
var ChoiceA = ko.observable(choices()[0]);
它将选择一个选项,该选项用于手动绑定这样的选择列表。只需坚持使用选项绑定。我这里讲的是select对象的初始绑定。如果您在不更改任何选择的情况下查看JSFIDLE示例,您将看到构建select的两种看似相同的方法以不同的方式运行。在我的真实案例中,我希望将可观察值绑定到另一个对象,以及有效地显示其他地方当前选择的选择。一旦进行了新的选择,这很好,但原始值始终显示为空白-即使选择了正确的选项。没关系,你不能将其绑定到对象,传递一个整数,我的理解是,我在两个例子中都有效地做了同样的事情。我修改了jsfiddle中的代码,尝试将ChoiceA设置为选项项,并将optionsText/optionsValue添加到select绑定中。这两个都没什么区别。博洛拉,不是。在第一个示例中,您将选项绑定到具有多个属性的JavaScript对象。然后为所选选项指定一个整数值。在应用绑定上,knockout意识到整数与选项绑定中的任何对象都不匹配。我明白你的意思,但这并不能真正解决问题。我更新了代码,以便ChoiceA和ChoiceB都使用来自选项的对象进行初始化。尽管如此,绑定后这两个值都会被覆盖-ChoiceA作为字符串匹配普通选项值类型,ChoiceB作为数字匹配Choices对象中的Id类型。在这两个示例中,这样做都未能选择正确的选项。我所做的就是你所建议的吗?嗯,是的,我必须编写一个自定义绑定处理程序来完成我之前所做的工作,才能让它正常工作。但这似乎很奇怪。我几乎把它归结为一个bug,但我想确保我没有遗漏任何愚蠢的东西。api文档底部有关于选项绑定的注释。在没有深入挖掘消息来源的情况下,他们似乎认为,在选择选项时,对选定的值有一定的考虑。无论是谁否决了这个答案:虽然没有给出解决方案,但它至少证实了我不是唯一一个在这方面遇到问题的人。虽然我不认为这个答案特别有用,但我也不认为它毫无用处/我也遇到了同样的问题,可以在手动添加选项时确认初始值为空。我必须手动添加它们的原因是,我需要绑定到一个列表,并将列表中不存在的其他值添加到选项中。