6

有几件事我不明白。根据 KO 文档(以及关于 SO 的许多帖子),在查询和编写 observable 时应该使用括号。但是在绑定子属性时,在我看来,是否使用括号并不重要。

<span data-bind="text: selectedMessage() && selectedMessage().message().subject()"></span>
<span data-bind="text: selectedMessage() && selectedMessage().message().subject"></span>

= 都返回正确的值。

谁能向我解释这是为什么?

小提琴:http: //jsfiddle.net/viktorb/DKg74/

4

2 回答 2

6

如果绑定值是一个 observable,KO 会为你“解包”它,所以你不必自己用括号解包(或调用 ko.utils.unwrapObservable)。

在您的第二个示例中,绑定值为:selectedMessage() && selectedMessage().message().subject。当这个表达式对subject属性求值时,KO 看到求值的值是一个可观察的值,因此它会为您解开它。(在内部这可能只是对 ko.utils.unwrapObservable 的调用)。

But, since the expression doesn't evaluate to the message property, which I'm assuming is also an observable, the parentheses for accessing that property are necessary (e.g. selectedMessage().message.subject wouldn't work).

于 2012-11-18T21:27:15.207 回答
4

就像文档说的那样:

observables 的全部意义在于它们可以被观察到,也就是说,其他代码可以说它希望收到更改通知。这就是 KO 的许多内置绑定在内部所做的。因此,当您编写 data-bind="text: personName" 时,文本绑定将自己注册为在 personName 更改时收到通知(假设它是一个可观察的值,现在就是这样)。

这是关于存在observable与否。

有关更多信息,请参阅http://knockoutjs.com/documentation/observables.html上的读写 observables

我稍微修改了你的小提琴,你可以看到带和不带括号的区别:http: //jsfiddle.net/DKg74/1/

于 2012-11-18T21:26:44.163 回答