我没有得到很多东西。 根据KO文档(以及SO上的许多帖子),在查询和编写可观察对象时应使用括号。但是当绑定子属性时,在我看来,如果你使用括号,它并不重要。
<span data-bind="text: selectedMessage() && selectedMessage().message().subject()"></span>
<span data-bind="text: selectedMessage() && selectedMessage().message().subject"></span>
=两者都返回正确的值。
任何人都可以向我解释为什么会这样吗?
答案 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/