【发布时间】:2018-11-06 23:00:30
【问题描述】:
我正在尝试创建一个自定义 KO 绑定,它接受一个可观察数组,并向 DOM 添加一个嵌套元素以包含可观察数组中元素的过滤子集。
在初始化我的自定义绑定时,我认为我需要做两件事。首先扩展绑定上下文,添加第二个 observable 数组来保存 this 绑定到的 observable 数组的过滤子集。其次,在绑定元素之后添加我想要的DOM元素。
然后在更新此绑定绑定到的可观察数组时,填充在初始化期间添加到绑定上下文的可观察数组。
到目前为止,我有以下不工作的、大大简化的实验。
ko.bindingHandlers.suggester = {
init: function ( element, valueAccessor, allBindings, viewModel, bindingContext ) {
var innerBindingContext = bindingContext.extend(valueAccessor);
innerBindingContext.suggestions = ko.observableArray();
var ul_element = jQuery(
'<ul data-bind="foreach: suggestions">' +
'<li data-bind="text: suggestionText"></li>' +
'</ul>'
);
jQuery(element).after(ul_element);
ko.applyBindingsToDescendants(innerBindingContext, element);
return { controlsDescendantBindings: true };
},
update: function ( element, valueAccessor, allBindings, viewModel, bindingContext ) {
var self = this;
jQuery.each(ko.unwrap(valueAccessor), function (index,value) {
if (/*do some filtering*/) {
bindingContext.suggestions.push({suggestionText: value});
}
});
}
};
我很清楚以上是非常错误的,但我从一个非常错误的想法跳到下一个,真的需要一些帮助。
======== 编辑 ========
我一直在玩,我有一些接近我所追求的东西,但仍然不起作用。
ko.bindingHandlers.autocomplete = {
init: function ( element, valueAccessor, allBindings, viewModel, bindingContext ) {
bindingContext.suggestions = ko.observableArray([{suggestionText: 'fred'}]);
var ul_element = jQuery(
'<ul data-bind="foreach: suggestions">' +
'<li data-bind="text: suggestionText"></li>' +
'</ul>'
);
jQuery(element).append(ul_element);
},
update: function ( element, valueAccessor, allBindings, viewModel, bindingContext ) {
var self = this;
bindingContext.suggestions.push({suggestionText: "another1"});
bindingContext.suggestions.push({suggestionText: "another2"});
}
};
这会将可观察数组 suggestions 添加到绑定上下文,将 ul/li 元素添加到 DOM 并正确更新它们。问题是我想在我使用此绑定的节点之后添加<ul> ,而不是在其中。当我将 jQuery(element).append(ul_element); 更改为 jQuery(element).after(ul_element); 时,它不起作用,没有显示任何内容。
此外,我不确定在我的自定义绑定中直接向绑定上下文添加可观察对象是否是“正确”的做法。
【问题讨论】:
标签: knockout.js