为什么对象的所有可观察属性值都是函数?

时间:2017-07-17 10:24:39

标签: javascript knockout.js

我有这个javascript对象:

title    date                    quantity     total
item1   2017-07-12,2017-07-13    100,200       300
item2   2017-07-12 ,2017-07-13   120,320       440
item3   2017-07-12 ,2017-07-13   450,150       600

点击按钮,我在var Email = function (data) { this.id = ko.observable(); this.clientID = ko.observable(data.clientID); this.email = ko.observable(data.email); this.iscc = ko.observable(data.iscc); } 数组中添加了新的email

emails

但我在function addCcEmail () { var client = self.selectedItem(); var email = new Email({ "id": "1", "clientId": "", "email": "", "iscc": "true" }); console.log(email); client.emails.push(email); } 上得到的结果如下:

console.log

我没有正确地发起它吗?

2 个答案:

答案 0 :(得分:4)

是的,你正确地做到了。所有属性都显示为函数的事实是因为它们的所有值都是ko.observable s,它们本身就是函数。

例如,如果选中email.id(),您将从可观察量中获得所需的值。

答案 1 :(得分:1)

事实上,淘汰观察是一种功能。因此,它记录为function(而不是实际值)。 只需调用该函数即可检索实际值。假设a = ko.observable(1),然后a(); // 1

如果你需要从对象创建observable,我可以推荐knockout mapping plugin,这样可以很容易地将对象的每个属性映射到一个observable(反之亦然)。

var Email = function (data) {
    this.id = ko.observable();
    this.clientID = ko.observable(data.clientID);
    this.email = ko.observable(data.email);
    this.iscc = ko.observable(data.iscc);
}

let a = new Email({ id: 1, clientID: 2, email: 'foo@xample.com', iscc: false });

console.log(a);
console.log(ko.mapping.toJS(a));
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<script src="https://cdn.jsdelivr.net/knockout.mapping/2.4.1/knockout.mapping-latest.js"></script>

您也可以通过拨打Email来替换ko.mapping.fromJS(data)功能。

我认为这使得挖掘可观察对象的调试对象变得更加容易。