我尝试编写自定义列表绑定。这就是我到目前为止所做的:
var myArr = ko.observableArray();
myArr.push("foo");
myArr.push("bar");
var view = {
matches: myArr
}
ko.bindingHandlers.matchList = {
init: function(element, valueAccessor, allBindingsAccessor, viewModel) {
// gives me 0
console.log(valueAccessor().length);
// gives me 2
console.log(valueAccessor()().length);
},
};
// Activates knockout.js
ko.applyBindings(view);
我的html绑定看起来如下:
<div data-bind="matchList: matches"></div>
为什么我必须使用第二对括号进入我的数组?
答案 0 :(得分:4)
valueAccessor是一个返回传递给绑定的函数的函数。它包含在一个函数中,因此不会立即进行求值。
典型的模式是:
var value = ko.utils.unwrapObservable(valueAccessor());
ko.utils.unwrapObservable
将安全地处理observable和non-observable并返回值。因此,如果它是可观察的,那么它将返回yourValue()
,否则它将返回yourValue
。这允许您的绑定支持对可观察对象或普通属性的绑定。
另外,一些绑定需要处理observable本身,一些绑定需要处理observable的值。因此,默认情况下,observable不会被打开。因此,valueAccessor()返回您的observable(这是一个函数),然后由您决定是否要打开它以获取值或可能设置它的值。
答案 1 :(得分:1)
我认为这里令人困惑的是传递给valueAccessor
的{{1}}与传递给init
的同名参数不同。在init中,它是一个返回函数的函数,而函数又返回数组。从他们的documentation查看此示例代码。我在最后添加了两个控制台日志,它们应该显示valueAccessor()返回的函数:
update