为什么在knockoutjs中否定绑定值必须被打开

时间:2012-02-23 10:10:46

标签: knockout.js

我注意到在KnockoutJS中,如果否定值绑定不起作用:

像这样:

data-bind="showTip: enableTip, css: { disabled: !addButtonEnabled }"

无法正确拾取否定的addButtonEnabled变量。

然而,这确实有效:

data-bind="showTip: enableTip, css: { disabled: !addButtonEnabled() }"

为什么必须解开这个,而另一个则没有?

我正在使用淘汰赛1.2.1。

1 个答案:

答案 0 :(得分:15)

让我解释一下KO如何在你的例子中解析绑定。

实际上,data-bind包含JSON。 KO用{}符号包装它并评估为正常的JS代码。 在你的例子中,KO在评估后得到了这个对象:

{
    showTip: enableTip,
    css: { disabled: !addButtonEnabled }
}

css bindingHandler接收节点绑定应该应用于bindingAccessor函数。

评估此函数后,我们得到css绑定的“参数”。等于对象

{ disabled: !addButtonEnabled }

然后css bindingHandler遍历此对象的属性以设置相应的样式。谈到disabled属性,我们需要为它读取值。

通常所有标准绑定都以这种方式读取值:ko.utils.unwrapObservable(value)如果value不可观察,则返回value,或者值存储在此可观察变量中。

在您的情况下value = !addButtonEnabled。正如您所看到的,!addButtonEnabled是JavaScript表达式,不可观察。所以它只是评估这个表达式。实际上,从observable() != false开始,您的按钮始终处于启用状态。

在第二种情况下,要评估的值包含可观察值,因此它可以正常工作。

我想你