我對ko有一個特別棘手的問題。我會試着解釋一些例子。Knockoutjs - 新實例VM的複雜對象綁定
首先,這裏是我試圖渲染的HTML垃圾。 foreach變量「Appliances」是一個數組,是viewModel的一個屬性。選項數據也是視圖模型的屬性數組。這裏的名稱是ApplianceTypes。
<table>
<tbody data-bind="foreach: Appliances">
<tr>
<td>
<select data-bind="options: $root.ApplianceTypes, value: $data.ApplianceType.Id, optionsValue: 'Id', optionsText: 'ApplianceTypeDesc'">
</select>
</td>
<td>
<input data-bind="value: UnitNumber" />
</td>
</tr>
</tbody>
</table>
好了,現在我們已經考慮到這一點,這裏的數據填寫的想法好一點:
var viewModel = {
RequestNumber:37,
UnitNumber:3,
Appliances:[{
Id:2,
ApplianceType:{Id:5, ApplianceTypeDesc:"Water Heating Tankless"},
ServiceApplianceQuantity:"1",
}],
ApplianceTypes:[
{Id:5, ApplianceTypeDesc:"Water Heating Tankless"},
{Id:1, ApplianceTypeDesc:"Dryer"},
{Id:2, ApplianceTypeDesc:"Range"},
{Id:3, ApplianceTypeDesc:"Heating"},
{Id:4, ApplianceTypeDesc:"Water Heating"},
{Id:6, ApplianceTypeDesc:"Fireplace"},
{Id:7, ApplianceTypeDesc:"Make Up Air Heating"},
{Id:8, ApplianceTypeDesc:"BBQ"}
]
}
那麼,有沒有什麼大的問題就在這裏呢。我爲每個設備獲得一行用戶界面。每行都是一個填充了設備類型的類型下拉列表。如果我只是編輯我所擁有的,那麼viewModel.Appliances [i] .ApplianceType.Id更新和生活是很好的。如果我嘗試向我的設備陣列添加新設備,那麼applianceType.Id不會更新。下面是該代碼:
function ApplianceTypeViewModel() {
var self = this;
self.Id = ko.observable("5");
self.ApplianceTypeDesc = ko.observable("");
};
function ApplianceViewModel(applianceType) {
var self = this;
self.Id = ko.observable("-1");
self.ApplianceType = ko.observable(applianceType);
self.ServiceApplianceQuantity:"1"
};
viewModel.AddAppliance = function() {
viewModel.Appliances.push(new ApplianceViewModel(new ApplianceTypeViewModel()));
};
最終它會是不錯的applianceType從陣列複製的電器[I] .ApplianceType,但說實話,我只是試圖讓標識更新有。剩下的我可以在服務器上完成。
如果數據存在,它會每次都改變。當我使用AddAppliance創建它時,數據不會改變。
謝謝大家!