KnockoutJS - 何时使用带有可观察的括号

时间:2014-12-13 21:47:40

标签: knockout.js

我是KnockoutJS的新手并观察了主网站上的一些示例http://knockoutjs.com/examples/contactsEditor.html,有时在访问observable时会使用括号,有时则不使用括号。

在访问observables(和observableArrays)时,有人可以向我解释括号在哪些实例中是合适的?

带有括号和无括号的代码片段,用于访问相同的observable:

self.contacts = ko.observableArray(ko.utils.arrayMap(contacts, function(contact) {
    return { firstName: contact.firstName, lastName: contact.lastName, 
    phones:ko.observableArray(contact.phones) };
}));
// .... 
self.removePhone = function(phone) {
    $.each(self.contacts(), function() { this.phones.remove(phone) })
};

self.save = function() {
    self.lastSavedJson(JSON.stringify(ko.toJS(self.contacts), null, 2));
};

2 个答案:

答案 0 :(得分:1)

在Knockout中,当您需要评估可观察量时使用括号。 Observable是函数,因此您需要调用函数来获取值。因此,如果您有self.contacts = ko.observable()来获取此值,则可以使用self.contacts()。要设置您使用的值self.contacts(2)

如果您希望敲除知道值何时发生变化,您需要声明一个observable:

  • 数据在javascript中更改,视图应更新
  • 视图中的一个或多个字段(例如输入字段),该值附加到更改

Knockout文档解释了一些关于可观察量的内容:http://knockoutjs.com/documentation/observables.html

答案 1 :(得分:1)

我们通常用ko括号来评估observable/observableArray

示例:

 self.value1 = ko.observable(2);
 self.value2 = 2 ;
带括号的

self.value1() gives you 2 
self.value1 gives you function(){//blah blah} which actually denotes its observable

没有括号:

self.value2() gives undefined i.e not a function 
self.value2   gives you 2

简而言之,observables值只能使用括号来访问。如果您直接指定self.value2=2表示它就像var s=2那样,那么尝试将变量的值设为s()是没有意义的,我们可以简单地使用s

在您的方案中:

案例1:

如果他们通过contact.firstName访问值,则返回内部返回意味着firstName无法观察到

self.contacts = ko.observableArray(ko.utils.arrayMap(contacts, function(contact) {
    return { firstName: contact.firstName, lastName: contact.lastName, 
    phones:ko.observableArray(contact.phones) };
}));

案例2:

这里self.contacts不是一个普通数组,它的可观察数组可以访问它的内容&要循环,我们在那里使用()

self.removePhone = function(phone) {
    $.each(self.contacts(), function() { this.phones.remove(phone) })
};

案例3:

ko.toJS内,即使self.contactsself.contacts()都可以(参见上文)

self.save = function() {
    self.lastSavedJson(JSON.stringify(ko.toJS(self.contacts), null, 2));
};

如果您更改了预览数据保持静态的内容,您可以在这个小提琴 here 中查看自己,这只是说双向绑定不存在(不可观察)