我注意到在KnockoutJS中,如果否定值绑定不起作用:
像这样:data-bind="showTip: enableTip, css: { disabled: !addButtonEnabled }"
无法正确拾取否定的addButtonEnabled变量。
然而,这确实有效:
data-bind="showTip: enableTip, css: { disabled: !addButtonEnabled() }"
为什么必须解开这个,而另一个则没有?
我正在使用淘汰赛1.2.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
开始,您的按钮始终处于启用状态。
在第二种情况下,要评估的值包含可观察值,因此它可以正常工作。
我想你