Knockout嵌套对象和括号

时间:2012-11-18 20:37:33

标签: knockout.js

我没有得到很多东西。 根据KO文档(以及SO上的许多帖子),在查询和编写可观察对象时应使用括号。但是当绑定子属性时,在我看来,如果你使用括号,它并不重要。

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

=两者都返回正确的值。

任何人都可以向我解释为什么会这样吗?

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

2 个答案:

答案 0 :(得分:6)

如果绑定值是可观察的,KO会为您“解包”它,因此您不必使用括号(或调用ko.utils.unwrapObservable)自行解包。

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

但是,由于表达式评估为message属性,我假设它也是一个可观察的属性,因此访问该属性的括号是必要的(例如{{ 1}}不起作用。)

答案 1 :(得分:4)

就像文档说的那样:

  

可观察性的全部意义在于它们可以被观察到,即,其他代码可以说它希望被通知变化。这就是KO的许多内置绑定在内部所做的事情。因此,当您编写data-bind =“text:personName”时,文本绑定会自动注册,以便在personName更改时得到通知(假设它是一个可观察的值,现在是)。

关于observable是不是。

有关详细信息,请参阅http://knockoutjs.com/documentation/observables.html处的阅读和编写可观察对象

我已经修改了你的小提琴,你可以看到有和没有括号的区别:http://jsfiddle.net/DKg74/1/