我有以下情况。
示例 JavaScript:
function Foo() {
this.id = ko.observable("KEY_1"); //Current selected item
this.list = [{ id: "KEY_2", text: "Two" }, { id: "KEY_3", text: "Three" }]; //All available items
}
ko.applyBindings(new Foo());
这在值和选项 bindingHandlers 的帮助下绑定到 HTML-select。
data-bind="value: id, optionsEx: list"
可能当前选定的项目未包含在所有可用项目的列表中,因为它已在服务器上被删除,并且不应再被选中。由于历史原因,某些实体仍将 KEY_1 的值设置为 id。我想要的是,如果 id 的值不再在列表中,它应该作为虚拟条目添加到列表中,由客户端上的 bindingHandler 动态地称为“已删除”。
我尝试了以下
ko.bindingHandlers["optionsEx"] = {
update: function (element, valueAccessor, allBindingsAccessor) {
var allBindings = allBindingsAccessor(),
optionsValue = allBindings['optionsValue'],
value = ko.utils.unwrapObservable(allBindings['value']),
list;
if (value) {
list = //external function searching the list for the item any adding it if missing
ko.bindingHandlers.options.update(element, function () { return list; }, allBindingsAccessor);
} else {
ko.bindingHandlers.options.update(element, valueAccessor, allBindingsAccessor);
}
}
};
但这不起作用。谁能给我一个提示来实现这一目标?
更新:我创建了一个 jsfiddle。它很好奇,因为代码在 jsfiddle 中工作,但不在我们的开发分支中。我必须检查原因。但也许有人有更好的想法来实现该功能。
http://jsfiddle.net/philipoo/C46A8/
更新:正如我所见,bindingHandlers 的顺序是关键任务。也许这解决了我的问题。