Knockoutjs绑定到Property vs Property()

时间:2012-08-14 08:28:47

标签: knockout.js

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

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

请注意第二个示例中FirstName之后的两个parens。他们似乎都工作。有区别吗?

2 个答案:

答案 0 :(得分:2)

有区别。

如果FirstNameko.observable,他们只会两个。如果它是普通值,则只有第一个变体可以使用。

观察者不直接持有其价值。这是为该值提供访问的功能。因此必须调用来获取值(即严格正确为text: FistName())。

但是淘汰赛很有帮助,并期待这一点。因此,如果您自己没有这样做,它会为您调用此可观察对象。

负责这是辅助函数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/

答案 1 :(得分:1)

我建议你阅读以下文章: [10 Things to Know About KnockoutJS]

引用文章:

  

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

<div data-bind="visible: someFlag">...</div>
<div data-bind="visible: !someFlag()">...</div>