Knockout.js 将(剔除)foreach移到input SELECT标记之外会给我带来很多问题
我正在使用knockout和breeze,现在正在处理selecthtml标记 以下是实际执行情况: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
<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>
这有几件事-
好奇。如果第一次实施有效,为什么需要改变?我假设更改事件是由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;
}