2017-07-17 73 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更容易。

相關問題