Knockout.js 将(剔除)foreach移到input SELECT标记之外会给我带来很多问题

Knockout.js 将(剔除)foreach移到input SELECT标记之外会给我带来很多问题,knockout.js,breeze,Knockout.js,Breeze,我正在使用knockout和breeze,现在正在处理selecthtml标记 以下是实际执行情况: <select data-bind="value: vehicleId, foreach: $root.vehicles()"> <option data-bind="text: registration(), value: id()"></option> </select> <select data-bind="value: ve

我正在使用knockout和breeze,现在正在处理selecthtml标记

以下是实际执行情况:

<select data-bind="value: vehicleId, foreach: $root.vehicles()">
    <option data-bind="text: registration(), value: id()"></option>
</select>
<select data-bind="value: vehicleId">
    <!-- ko foreach: $root.vehicles() -->
        <option data-bind="text: registration(), value: id()"></option>
    <!-- /ko -->
</select>

当我测试我的页面时,我注意到breeze在第二个实现中并没有像预期的那样工作。当我更新数据(在任何输入中)时,breeze不再检测到我的更新。通常,当我更新页面上的内容时,我有
datacontext.hasChanges()
,这是真的。然后我显示按钮,如
保存
取消
。现在情况并非如此。如果我回到最初的实现,它会再次工作。我觉得很奇怪

有什么想法吗

谢谢


编辑

我也来看看这个:


但它似乎也不起作用。

您在底部发布的链接绝对正确-评论将从选择框中删除

问题不在于Breeze不工作——而是视图中的敲除绑定正在破坏,特别是选择框中的值绑定。这里有两种方法可以完美地工作,第一种是您首先发布的方法,这是有效的。第二种方法是为选项绑定使用computed,这是我更喜欢的方法

<select data-bind="value: selectedVehicle, options: vehicleOptions, optionsText: 'registration'"></select>
这有几件事-

  • 听起来您使用的是某种级联下拉列表,每当selectedVehicle发生变化时,计算结果都将被重构。如果它不是级联的,那么您可能可以跳过它,直接设置vehicleId或w/e的值

  • 它不再需要额外的无容器绑定,并且通过将逻辑移动到视图模型中来清理视图


  • 好奇。如果第一次实施有效,为什么需要改变?我假设更改事件是由select标记引发的。从技术上讲,您的选项值永远不会更改,仅在select标记的上下文中。此外,您的“注册”和“Id”不需要是可观察的,对吗?KO可以进行单向绑定,并非所有内容都必须是可观察的。需要为测试目的进行更改,并理解“为什么”和“如何”。我所有的元素都是可以观察到的,因为在这后面是来自breeze的一个查询,breeze会这样做……您正在更改哪些未更新的内容?某个外部数据绑定对象的
    车辆ID
    ?如果没有更多的信息,就很难说我的页面上有任何更新的数据,甚至是与此选择无关的内容(如输入框…)。在这种情况下(使用我的代码的第二个实现),breeze没有刷新
    管理器的状态。hasChangesChanged
    var selectedVehicle = ko.observable();
    var vehicleOptions = ko.computed(function () {
        var myArr = [];
        if (!selectedVehicle) { return myArr; }
        return myArr = (refreshVehicles());
    });
    function refreshVehicles() {
        // Go get vehicles or w/e based on selectedVehicle
        var locVehicles = getVehicles(selectedVehicle());
        return locVehicles;
    }