2017-06-22 47 views
0

我有一個集合,其中x的下拉量。我想填寫數據庫提供的列表中的下拉列表。父母的淘汰賽下拉列表查看模型

的HTML

<div class="input-col input-col-short"> 
    <select data-bind="options: $parent.insuranceCoverList(), optionsText: 'displayName', optionsValue: 'insuranceCoverId', value: selectedInsuranceCover"></select> 
</div> 

變量 「改編」 是空的,當我嘗試返回。如果我只返回帶有值的對象,那麼它可以工作,但不能用「arr」變量。 這是我insuranceCoverList()

self.insuranceCoverList = function() { 
    var arr = []; 
    // Get data from the DB 
    GetInsuranceCover(self.InsuranceTypeID()) 
     .done(function (data) { 
      $(data).each(function (i, v) { 
       arr.push(new AvailableDropdownItems({ dropdownItemId: v.ProgramCode, dropdownItemName: v.DisplayValue })); 
      }); 
     }); 
    // doesn't work 
    return arr; 
    // works 
    //return [{ insuranceCoverId: 0, displayName: "Option A" }, { insuranceCoverId: 1, displayName: "Option B" }, { insuranceCoverId: 2, displayName: "Option C" }]; 
}; 

,我不能有什麼建議?

+0

可能重複[如何從異步調用返回響應?](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous- call) –

回答

2

Ajax是異步的。您不能從異步函數返回值。

這是觀察對象的完美情況。創建一個可觀察數組來保存列表項並讓視圖依賴於該數組。

通過這種方式,只要將項目寫入此數組,就會自動更新視圖,例如,當Ajax請求返回時。就像Knockout的設計完全一樣。

視圖模型:

self.InsuranceTypeID = ko.observable(); 
self.insuranceCoverList = ko.observableArray(); 

// automatic loading! 
self.InsuranceTypeID.subscribe(function (insuranceTypeId) { 
    GetInsuranceCover(insuranceTypeId).done(function (data) { 
     self.insuranceCoverList(data.map(function (v) { 
      return new AvailableDropdownItems({ 
       dropdownItemId: v.ProgramCode, 
       dropdownItemName: v.DisplayValue 
      }); 
     })); 
    }); 
}); 

查看:

<div class="input-col input-col-short"> 
    <select data-bind="options: $parent.insuranceCoverList, optionsText: 'displayName', optionsValue: 'insuranceCoverId', value: selectedInsuranceCover"></select> 
</div> 

一般情況下不應.push()在循環中可觀察到的陣列。對數組的每次更改都會通知其所有依賴項(訂閱者/視圖綁定),然後依次通知它們的依賴關係,依此類推。

如果您要替換數組的內容,請先創建這些項目,然後將它們一步推入數組中,就像上面數組接收data.map()的結果一樣。

+1

感謝您幫助我,並給我提示'data.map()'。它最終作品 我不得不添加的唯一東西是 'self.InsuranceTypeID = ko.observable();' – loonybin

+0

標準JS函數,['Array#map'](https://developer.mozilla.org/en /文檔/網絡/的JavaScript /參考/ Global_Objects /陣列/圖)。關於'self.InsuranceTypeID()' - 我認爲情況已經如此。你在你自己的代碼中使用它就像一個可觀察的。 – Tomalak