2017-07-17 70 views
1

我有这样的JavaScript对象:为什么所有对象的可观察属性值都是函数?

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); 
} 

在按钮点击我加入一个新emailemails阵列:

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结果看起来是这样的:

Email {id: function, clientId: function, email: function, iscc: function} 

我没有正确地启动它吗?

+2

'observable()'你是否从这个函数返回任何值? – Durga

+1

JSON标签与此有什么关系? – evolutionxbox

+0

@Durga这不是一个函数,它是一个Knockout声明。 – user3378165

回答

4

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

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

+0

感谢您的解释,我认为我的声明有些问题,因为当我在另一个函数中访问它时:'var mappedEmails = $ .map(client.emails(),function(item){' ' console.log(item.email());'我在控制台上发现一个错误:'item.email不是一个函数',那么我在做什么错? – user3378165

+0

@ user3378165在你的代码中, 'client.emails'。我没有看到**发票**部分,但是如果你为'client.emails'调用'$ .map',它应该可以正常工作。 – SVSchmidt

+0

@SVSchmidt我写过错误,只是在我编辑我的评论之后 – user3378165

1

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

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

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: '[email protected]', 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)

我认为这使调试对象的knockout observables更容易。

相关问题