我有一个可观察的数组绑定到下拉列表。通过ASP.NET MVC Html Helpers在页面加载时填充下拉列表,但由于可观察数组设置为[],因此它会删除所有内容。有没有办法不删除页面加载或初始应用绑定上的所有内容。
答案 0 :(得分:1)
听起来你想在以后设置来自observable数组的选项(可能是从AJAX调用?)。 Knockout没有任何内置方法来执行此操作。我发现你至少有三个选择:
显而易见的方法是让ASP.NET代码填写可观察数组而不是选择列表。然后Knockout会做正确的事情并填充你的下拉列表。
使用包装options
绑定的自定义绑定,但忽略空数组:
ko.bindingHandlers.optionsNotBlank = {
update: function (element, valueAccessor, allBindingsAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor());
if (value.length)
ko.bindingHandlers.options.update(element, valueAccessor, allBindingAccessor);
}
};
动态设置下拉列表中的options
绑定。这不是已发布的功能,但使用导出的Knockout方法。您将使用data-bind
方法并在填写可观察数组后将其传递给绑定对象,而不是使用标准ko.applyBindingsToNode
属性。您需要小心,只能拨打ko.applyBindingsToNode
一次。
viewModel.myArrayOfItem(newValues);
if (!boundDropDown) {
ko.applyBindingsToNode(document.getElementById("mydropdown"), { options: viewModel.myArrayOfItems }, viewModel);
boundDropDown = true;
}
编辑:
这是基于使用“脏”标志的评论的第四个选项:
ko.bindingHandlers.optionsNotBlank = {
update: function (element, valueAccessor, allBindingsAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor()),
isDirty = element._isDirty;
if (isDirty || value.length) {
element._isDirty = true;
ko.bindingHandlers.options.update(element, valueAccessor, allBindingAccessor);
}
}
};