2012-06-08 24 views
4

我有一個奇怪的問題,至少我覺得這很奇怪。

以下將顯示什麼:

<input type="text" data-bind="value: selectedAddress.street1" /> 

但是,如果綁定這樣的話,就說明正確的值,但不更新(顯示值,但似乎並沒有綁定到對象):

<input type="text" data-bind="value: ko.toJS($data).selectedAddress.street1" /> 

我檢查,如果selectedAddress對象實際上包含了數據:

JSON.stringify(ko.toJS(selectedAddress), null, 2) 

一第二它確實

{ 
"id": 5631, 
"street1": "Some Adress 43", 
"street2": null, 
"postcode": "15850", 
"city": "GhostTown", 
"country": "UK", 
"addressTypes": [] 
} 

如何讓輸入字段正確綁定到對象的屬性和顯示/更新相應的價值?

視圖模型:

var theViewModel = function() { 
     var self = this; 
     self.no = ko.observable(); 
     self.name = ko.observable(); 
     self.addresses = ko.observableArray([]); 
     self.selectedAddress = ko.observable(new Address()); 
     ... 
} 

我在做什麼錯?

+2

嘗試'data-bind =「value:selectedAddress()。street1」' - 我不確定在連接observables時是否支持隱式括號。 – Niko

+0

感謝您的幫助。它現在工作! – Xatep

+0

Niko,想做那個答案,所以可以接受嗎? :) –

回答

3

括號只在某些情況下是可選的,但在引用對象的屬性時(可能不是可觀察值的值)可能不是可選的。因此,您需要明確使用括號來獲取可觀察值selectedAddress的值。然後,您可以參考此對象的屬性street1(括號現在可選):

data-bind="value: selectedAddress().street1" 
2

這是一個雙向綁定的解決方案(價值不會被更新)。

這裏是KnockoutJS資料報價http://knockoutjs.com/documentation/value-binding.html

如果引用的東西是不是一個簡單的屬性,例如,一個複雜的JavaScript表達式或子屬性,KO將表單元素的初始狀態設置爲值,但當用戶編輯表單元素時,它將無法寫回任何更改。在這種情況下,它只是一次性值設置器,而不是真正的綁定。

要獲得雙向綁定功能,請使用模板。 喜歡的東西:

<script type="text/html" id="someTemplate"> 
    <input type="text" data-bind="value: street1" /> 
</script> 

<div data-bind="template: { name: 'someTemplate', data: selectedAddress }"></div> 
0

如果有人有同樣的問題,並想知道這部分

self.selectedAddress = ko.observable(new Address()); 

而且你可能會問是否有必要創建一個構造函數或對象,填補了KO。可觀察函數,你可以,但是如果你不喜歡爲這個模型創建一個模型,只需要添加一個空數組並且括號方法應該可以工作。

例如:

self.selectedAddress = ko.observable([]); 

則:

selectedAddres().street1 

這可能不適用於其他情況下工作,但到目前爲止,它的工作在我身上。謝謝你的回答,爲我節省了很多時間!