Knockout.js 手动添加的选择选项会导致清除可观察值

Knockout.js 手动添加的选择选项会导致清除可观察值,knockout.js,Knockout.js,在将选项手动添加到绑定选择元素的场景中,应用绑定后,可观察对象的原始值将丢失。如果使用选项绑定添加选项,则该值不会丢失。我已经在这里演示了效果: 编辑:请注意,我指的是select的初始创建/绑定,而不是以后向现有select添加选项 这有什么原因吗 示例代码: <!-- In this test, select options are added manually within a foreach construct. Select works as expect

在将选项手动添加到绑定选择元素的场景中,应用绑定后,可观察对象的原始值将丢失。如果使用选项绑定添加选项,则该值不会丢失。我已经在这里演示了效果:

编辑:请注意,我指的是select的初始创建/绑定,而不是以后向现有select添加选项

这有什么原因吗

示例代码:

<!-- 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文档底部有关于选项绑定的注释。在没有深入挖掘消息来源的情况下,他们似乎认为,在选择选项时,对选定的值有一定的考虑。无论是谁否决了这个答案:虽然没有给出解决方案,但它至少证实了我不是唯一一个在这方面遇到问题的人。虽然我不认为这个答案特别有用,但我也不认为它毫无用处/我也遇到了同样的问题,可以在手动添加选项时确认初始值为空。我必须手动添加它们的原因是,我需要绑定到一个列表,并将列表中不存在的其他值添加到选项中。