2014-09-22 70 views
0

我有一個selectOptions ajax爲基礎的asincronous加載器;它接受遠程地址,並返回可觀察到的陣列,正確地填充了描述和鍵值被接受以下結合Asyncronous knockout observableArray選擇選項加載

<select data-bind="value: selectedVal, options: opts, optionsText: 'desc', optionsValue:'key', optionsCaption: ''"/></div> 

事實是,作爲asincronous,當我觸發選擇選項改變的基礎上,一些用戶行動,我把它分配給我的模型observable數組,我沒有得到選擇popuated,但仍然是空的。

mymodel.opts = loadOptions("<remoteaddress>"); 

我知道,當第二行被稱爲前面回答是還沒到,但返回的值是一個observableArray,所以它應該正確填充時,具有被分配到與UI綁定可觀察到的陣列響應。

如果我從ajax調用中返回的對象(當它返回時)從Firefox中的console.log中獲取它,或者如果我將可觀察數組opts傳入loadOptions並將其更改爲在其內部構建opts ,那麼它的工作原理,但我真的需要按原樣使用loadOptions,asincronous。我也嘗試追加mymodel.opts.valueHasMutated(),但是ko不能使用newlly到達的observableArray。

如果可能會保留選項加載器,並且如果可能的話,不使用自定義綁定,我可以使用傳入的可觀察數組進行綁定嗎?

回答

1

你得到的問題是,當這條線運行:

mymodel.opts = loadOptions("<remoteaddress>"); 

它與一個不同observableArray更換整個觀察到的陣列,而不是更新當前的一個。你需要更新現有的 - 你可以改變loadOptions返回一個正常的數組,而不是一個可觀察的數組?你可以這樣做:

//clear any existing entries 
mymodel.opts.removeAll(); 
//push the new entries in 
mymodel.opts.push.apply(mymodel.opts, loadOptions("<remoteaddress>")); 
+0

無法更改它。但即使我可以,如果它返回一個非可觀察對象,它將在異步調用時爲空,所以我不會加載任何選項。它與分配mymodel.opts(loadOptions(「」)());相同。它不填充選項,即使ajax稍後正確返回對象 – Nillus 2014-09-22 16:18:09

+0

啊我想我會看到 - 它返回的observableArray會在以後更新嗎?在代碼中你有'model.opts = loadOptions ...'的地方,是否在applyBindings被調用之前? – 2014-09-22 16:23:56

+0

如果是這樣的話,我認爲你需要展示'loadOptions'本身在做什麼 - 我認爲這個問題可能存在於 – 2014-09-22 16:25:24