Knockout.js:自定义绑定中的数组参数

时间:2011-09-10 13:30:49

标签: javascript arrays knockout.js

我尝试编写自定义列表绑定。这就是我到目前为止所做的:

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>

为什么我必须使用第二对括号进入我的数组?

2 个答案:

答案 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