我正在尝试创建一个定制的ko绑定,它接受一个可观察数组,并向DOM添加一个嵌套元素,以包含可观察数组中元素的过滤子集。
在初始化自定义绑定时,我认为我需要做两件事。首先扩展绑定上下文,添加第二个可观察数组,以保存与之绑定的可观察数组的过滤子集。其次,在绑定元素之后添加我想要的DOM元素。
然后,在更新绑定到的可观察数组时,填充在init期间添加到绑定上下文的可观察数组。
到目前为止,我已经做了以下的,非工作的,非常简单的实验。
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
元素并正确更新它们。问题是我想添加
<ul>
之后
我使用此绑定的节点,而不是它内部的节点。当我改变的时候
jQuery(element).append(ul_element);
到
jQuery(element).after(ul_element);
它不起作用,不显示任何内容。
另外,我不确定在我的自定义绑定中直接向绑定上下文添加可观察的内容是否是“正确”的事情。