2013-05-17 58 views
4

類似this post ...KnockoutJS - 綁定選擇選項的一個對象

這是我的財產視圖模型:

function propertyViewModel() { 
    var self = this; 
    self.propertyTypeList = ko.observableArray([]); 
    self.selectedPropertyType = ko.observable(); 
} 

這是我的財產類型的模型:

function propertyTypeModel(id, name) { 
    this.Id = ko.observable(id); 
    this.Name = ko.observable(name); 
} 

我用signalR從數據庫中獲取數據,並在成功時調用以下客戶端函數:

connection.client.populatePropertyTypeList = function (propertyTypeList) { 
    var mappedTypes = $.map(propertyTypeList, function (item) { 
     return new propertyTypeModel(item.Id, item.Name); 
    }); 
    self.propertyTypeList(mappedTypes); 
}; 

和:

connection.client.populatePropertyDetails = function (property) { 
    self.selectedPropertyType(new propertyTypeModel(property.PropertyType.Id, property.PropertyType.Name)); 
}; 

首先一個填充具有的所有可能的屬性類型的可觀察到的陣列和第二個獲取的相關屬性類型並將其綁定到selectedPropertyType。

一切正常,直到我嘗試引入一個下拉列表,如下與selectedPropertyType的名稱預先填充它:

<select data-bind="options: propertyTypeList, optionsText: 'Name', value: selectedPropertyType"></select> 

這使我觀察到的物體(selectedPropertyType)改變其值列表中的第一個可用選項。 我的理解是,雖然此列表呈現propertyTypeList尚未填充並導致selectedPropertyType默認爲第一個可用值,但爲什麼Knockout在調用connection.client.populatePropertyDetails時不更新對象?

我可以將選擇列表綁定到Id,如果我引入一個新的對象只有Id,但是我想讓它綁定到整個selectedPropertyType對象。可能嗎?

回答

6

您在populatePropertyDetails回調中創建一個新對象。

儘管它有在propertyTypeListthis.Idthis.Name作爲相應的對象相同的屬性值,它是不一樣的對象

試着改變你的回調到這一點:

connection.client.populatePropertyDetails = function (property) { 
    var type = property.PropertyType, 
     list = self.propertyTypeList(); 

    var foundType = ko.utils.arrayFirst(list, function(item) { 
     return item.Id() == type.Id && item.Name() == type.Name; 
    }); 
    if(foundType) { 
     self.selectedPropertyType(foundType); 
    } 
}; 
+2

我接受一個編輯從Jalayn因爲,雖然代碼不會實質上是一樣的,在'ko.utils'是更具描述性的使用arrayFirst'的'用'return'或'break;'語句的'for'循環試圖完成什麼?因此,對未來的開發人員/調試人員更好。 – Sethi

+0

非常感謝。 – Jalayn

+0

感謝這兩個。這正如預期的那樣工作。 – Jerry