我可以用两种不同的方式编写一个 knockoutjs 数据绑定表达式:
1. <div data-bind="text: FirstName"></div>
2. <div data-bind="text: FistName()"></div>
请注意第二个示例中 FirstName 之后的两个括号。它们似乎都有效。有区别吗?
我可以用两种不同的方式编写一个 knockoutjs 数据绑定表达式:
1. <div data-bind="text: FirstName"></div>
2. <div data-bind="text: FistName()"></div>
请注意第二个示例中 FirstName 之后的两个括号。它们似乎都有效。有区别吗?
它们是有区别的。
它们只有在FirstName
是ko.observable
. 如果它是一个普通值,则只有第一个变体有效。
可观察对象不直接保存其值。它是一个提供对值的访问的函数。因此必须调用它来获取值(即,严格正确的是text: FistName()
)。
但是淘汰赛是有帮助的,并且可以预料到这一点。因此,如果您自己没有这样做,它将为您调用 observable。
对此负责的是辅助函数ko.utils.unwrapObservable()
,它接受一个参数,确定它是可观察值还是普通值,并在两种情况下都返回其值。
Knockout 在您定义的每个绑定上都使用此函数,因此您自己调用 observable ( text: FistName()
) 或让 knockout 在幕后执行 ( text: FirstName
) 都没有关系。
怪癖:
Knockout 解析绑定表达式<binding>: <expr>
并确定<expr>
是简单标识符还是更复杂的标识符。
无论何时<expr>
是一个简单的标识符——比如——FirstName
敲除将unwrapObservable()
自动应用,因为情况是明确的。
但无论何时<expr>
更复杂——比如'Dear ' + FirstName
——knockout 从表达式构造一个自定义函数。现在事情变得模棱两可,您需要自己调用可观察对象,如下所示'Dear ' + FirstName()
:
比较:http: //jsfiddle.net/Tomalak/cU4qw/
我建议您阅读以下文章: [关于 KnockoutJS 的 10 件事]
引用文章:
大多数绑定将调用
ko.utils.unwrapObservable
传递给它的值,这将安全地返回可观察对象和不可观察对象的值。但是,在绑定中,如果您在表达式中使用可观察对象,则需要将其作为函数引用。同样,在代码中,您通常需要将 observables 引用为函数,除非您实际上想要传递 observable 本身(而不是值)。
<div data-bind="visible: someFlag">...</div>
<div data-bind="visible: !someFlag()">...</div>