1

我可以用两种不同的方式编写一个 knockoutjs 数据绑定表达式:

1. <div data-bind="text: FirstName"></div>
2. <div data-bind="text: FistName()"></div>

请注意第二个示例中 FirstName 之后的两个括号。它们似乎都有效。有区别吗?

4

2 回答 2

2

它们是有区别的。

它们只有FirstNameko.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/

于 2012-08-14T08:42:14.027 回答
1

我建议您阅读以下文章: [关于 KnockoutJS 的 10 件事]

引用文章:

大多数绑定将调用ko.utils.unwrapObservable传递给它的值,这将安全地返回可观察对象和不可观察对象的值。但是,在绑定中,如果您在表达式中使用可观察对象,则需要将其作为函数引用。同样,在代码中,您通常需要将 observables 引用为函数,除非您实际上想要传递 observable 本身(而不是值)。

<div data-bind="visible: someFlag">...</div>
<div data-bind="visible: !someFlag()">...</div>
于 2012-08-14T08:36:58.040 回答