我對knockout.js相當陌生,但是,我一直很高興地在ASP.NET MVC 4項目中使用它,直到遇到這個困擾我一段時間的障礙似乎無法指引我。knockout.js - 嵌套數組數據和級聯預填充下拉列表綁定
我正在處理的場景需要位置數據(地區,國家,城市)的幾個組合,即級聯下拉列表,這不是輸入新數據時要做的問題,但我遇到了問題( s)時試圖編輯保存的數據。
數據處於JSON格式,具有嵌套的數組,看起來像這樣(縮短用於說明目的):
var newData =
[
{
"ID":1,
"Name":"Australia and New Zealand",
"Countries":[
{
"ID":13,
"Name":"Australia",
"Cities":[
{
"ID":19,
"Name":"Brisbane"
},
{
"ID":28,
"Name":"Cairns"
},
...
我懷疑無法加載的數據(或者更明確地,爲了綁定它),因爲我在訪問區域子數組(包含區域國家)和國家子數組(包含國家城市)時遇到問題。
然後有預填充選項的問題,它部分工作,viewmodel加載行數,但不選擇任何東西。
這裏的VM:
var existingRows = [
{
"Region": 1,
"Country": 13,
"City": 19
},
{
"Region": 1,
"Country": 158,
"City": 3
}];
var Location = function (region, country, city) {
var self = this;
self.region = ko.observable(region);
self.country = ko.observable(country);
self.city = ko.observable(city);
// Whenever the region changes, reset the country selection
self.region.subscribe(function() {
self.country(undefined);
});
// Whenever the country changes, reset the city selection
self.country.subscribe(function() {
self.city(undefined);
});
};
var LocationViewModel = function (data) {
var self = this;
self.lines = ko.observableArray(ko.utils.arrayMap(data, function (row)
{
var rowRegion = ko.utils.arrayFirst(newData, function (region)
{
return region.ID == row.Region;
});
var rowCountry = ko.utils.arrayFirst(rowRegion.Countries, function (country) {
return country.ID == row.Country;
});
var rowCity = ko.utils.arrayFirst(rowCountry.Cities, function (city) {
return city.ID == row.City;
});
return new Location(rowRegion, rowCountry, rowCity);
}));
// Operations
self.addLine = function() {
self.lines.push(new Location())
};
self.removeLine = function (line) {
self.lines.remove(line)
};
};
var lvm = new LocationViewModel(existingRows);
$(function() {
ko.applyBindings(lvm);
});
HTML代碼:
<tbody data-bind="foreach: lines">
<tr>
<td><select data-bind="options: newData, optionsText: 'Name', optionsValue: 'ID', optionsCaption: 'Select a region...', attr: { name: 'SubRegionIndex' + '['+$index()+']' }, value: region"></select></td>
<td><select data-bind="options: Countries, optionsText: 'Name', optionsValue: 'ID', optionsCaption: 'Select a country...', attr: { name: 'CountryIndex' + '['+$index()+']' }, value: country"></select></td>
<td><select data-bind="options: Cities, optionsText: 'Name', optionsValue: 'ID', optionsCaption: 'Select a city...', attr: { name: 'CityIndex' + '['+$index()+']' }, value: city"></select></td>
<td><a href='#' data-bind='click: $parent.removeLine'>Remove</a></td>
</tr>
</tbody>
我試圖從knockout.js網站與預填充的數據修改車編輯器的例子,但還沒有真正取得多大進步,我似乎失去了一些東西。沒有真正與嵌套數組發現任何東西,所以我堅持在這裏......
我已經忍了完整的代碼上的jsfiddle這裏: http://jsfiddle.net/fgXA2/1/
任何幫助,將不勝感激。
謝謝你的解決方案,並且調試指針!真的很感激它。只是一個後續的問題 - 因爲我提交表單到服務器,我仗着optionsValue,所以我想我將不得不使用你的第二個建議,可用最好的選擇? – zpodbojec
回答我自己的問題 - 我已經按照您的第二個建議,並使用添加/刪除行選項對其進行了擴展。很棒。謝謝你的靈感:) – zpodbojec
如果您使用的是正常的表單提交發送數據到服務器,然後是你需要設置'optionsValue'參數。或者,您可以使用視圖模型來提交數據,在這種情況下,您可以完全控制發送的內容。 –