我可以用两种不同的方式编写knockoutjs数据绑定表达式:
1. <div data-bind="text: FirstName"></div>
2. <div data-bind="text: FistName()"></div>
请注意第二个示例中FirstName之后的两个parens。他们似乎都工作。有区别吗?
答案 0 :(得分:2)
有区别。
如果FirstName
是ko.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()
。
答案 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>