Knockout.js Knockoutjs绑定到属性vs属性()

Knockout.js Knockoutjs绑定到属性vs属性(),knockout.js,Knockout.js,我可以用两种不同的方式编写knockoutjs数据绑定表达式: 1. <div data-bind="text: FirstName"></div> 2. <div data-bind="text: FistName()"></div> 1。 2. 注意第二个例子中FirstName后面的两个paren。他们两个似乎都工作。有区别吗 我建议您阅读以下文章: 文章引述: 大多数绑定都会对传递的值调用ko.utils.unwrapObservab

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

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

注意第二个例子中FirstName后面的两个paren。他们两个似乎都工作。有区别吗

我建议您阅读以下文章:

文章引述:

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

。。。
...
有一点不同

只有当
FirstName
是一个
ko.observable
时,它们才能同时工作。如果是普通值,则只有第一个变量有效

一个可观察的事物并不直接持有它的价值。它是一个提供对值的访问的函数。因此,必须调用它来获取值(即严格正确的is
text:FistName()

但是淘汰赛是有帮助的,而且是预期的。因此,如果你不是自己做的话,它会为你召唤可观察的

负责此操作的是帮助函数
ko.utils.unwrapObservable()
,它接受一个参数,确定它是可观察值还是普通值,并在这两种情况下返回其值

Knockout在您定义的每个绑定上都使用此函数,因此无论您是自己调用可观察对象(
text:FistName()
),还是让Knockout在幕后执行(
text:FirstName


怪癖:

Knockout解析绑定表达式
,并确定
是简单标识符还是更复杂的标识符

只要
是像
FirstName
这样的简单标识符,就会自动应用
unwrapObservable()
,因为情况是明确的

但是每当
变得更复杂时,比如
'Dear'+FirstName
-knockout就会从表达式构造一个自定义函数。现在事情变得模棱两可,你需要自己调用可观察对象,比如:
“亲爱的”+FirstName()


比较:

谢谢大家!现在有道理了。
<div data-bind="visible: someFlag">...</div>
<div data-bind="visible: !someFlag()">...</div>