2013-03-13 55 views
3

請參閱本小提琴:http://jsfiddle.net/44AwW/3/Knockout.js:綁定對象作爲在<select> /值下拉

3秒鐘之後,一個新的「地點」被添加到<table>(作爲一種方式來模擬Ajax的加載數據)。 'Place'是一個簡單的JS對象,但它的兩個屬性(City和PlaceType)本身就是對象 - 每個對象都有一個'id'和'name'屬性。

var Place = { 
    id: 1, 
    name: "Paradiso", 
    placeType: { 
     id: 1, 
     name: "Concert Hall" 
    }, 
    city: { 
     id: 1, 
     name: "Amsterdam" 
    }, 
    address: "Somewhere in the city" 
} 

單擊編輯選項時,請從放置在網格中的值應在形式設置:在城市和地點類型<select> S的關係分別顯示「阿姆斯特丹」和「音樂廳」,但只顯示/設置「姓名」和「地址」。

現在,當我通過表單本身和添加按鈕添加一個新的地方,然後單擊表格中剛創建的地方的編輯鏈接時,它的所有屬性都確實設置並顯示在表單中,包括City和PlaceType。

因此,通過表單創建並添加到observableArray(因此在<table>上顯示)的位置在使用編輯按鈕時,其所有屬性值都可以正確顯示,但當以編程方式添加位置時(如在小提琴中)或通過ajax,City和PlaceType屬性無法設置並顯示在表單上。

我錯過了什麼?

回答

4

的Javascript按引用比較的對象。簡單看起來相同的對象不會相互匹配。當您從選擇列表中進行選擇時,您會收到存儲在citiesplaceTypes中的對象的引用。但是當你通過ajax加載一個對象時,你會得到一個看起來一樣的新對象。

有兩種方法可以解決這個問題。首先是使用字符串進行匹配。在這種情況下,您將添加一個optionsValue綁定到您的select元素。第二個是單獨查找對象(使用諸如ko.utils.arrayFirst之類的東西)並在編輯之前存儲該對象。

updated your example顯示如何使用optionsValue而只存儲城市的id s和您的place對象的地方類型。

+0

你現在就在。我老實說,這些對象的概念並不匹配,只是「看起來相同」,但我只是覺得KO非常棒,足以讓它工作:P - 無論如何,我已經在考慮用find函數來查看對象。我嘗試了'optionsValue',但無法使其工作 - 您能否就此方法提供任何其他幫助? – 2013-03-13 04:33:12

+0

我加了一個使用'optionsValue'的例子。 – 2013-03-13 09:01:37

0

您應該使用with綁定進行編輯和特定記錄。點擊這裏,查看答案:

Edit item in knockout observableArray

+0

感謝您的快速回答。在你提供的代碼中,雖然有一個'