2011-04-18 75 views
4

我有一個dijit.form.FilteringSelect組件,我想動態更改選項。但是,我從商店屬性中獲取了dijit.form.FilteringSelect商店;商店中沒有setter功能。 (它可能是一個dojo.store.Reader)dijit.form.filteringselect動態更改選項

那麼如何更改dijit.form.FilteringSelect的選項?我應該直接用DOM來改變它嗎?有沒有辦法更新dijit.form.FilteringSelect後面的商店?

回答

8

存在道場兩件式的數據存儲:

  1. dojo.data.ItemFileReadStore - 只讀數據存儲
  2. dojo.data.ItemFileWriteStore - ItemFileReadStore的擴展,對dojo.data.api.Write

    在增加你的情況下,你應該使用ItemFileWriteStore - 它提供了修改商店數據的功能。

如:

你國家的數組,要在過濾使用它選擇:

[{ 
    abbr: 'ec', 
    name: 'Ecuador', 
    capital: 'Quito' 
}, 
{ 
    abbr: 'eg', 
    name: 'Egypt', 
    capital: 'Cairo' 
}, 
{ 
    abbr: 'et', 
    name: 'Ethiopia', 
    capital: 'Addis Ababa' 
}] 

首先,你需要創建ItemFileWriteStore數據存儲JS變量。

<script> 
    dojo.require("dojo.data.ItemFileWriteStore"); 
    dojo.require("dijit.form.FilteringSelect"); 

    var storeData = { 
     identifier: 'abbr', 
     label: 'name', 
     items: //YOUR COUTRIES ARRAY 
     } 
</script> 

下一步 - 申報HTML標記過濾選擇和itemFileWriteStore:

<div dojotype="dojo.data.ItemFileWriteStore" data="storeData" jsid="countryStore"></div> 
<div dojotype="dijit.form.FilteringSelect" store="countryStore" searchattr="name" id="filtSelect"></div> 

最後的附加創建特殊功能/刪除/修改過濾項目選擇:

添加新項:

function addItem() { 
    var usa = countryStore.newItem({ abbr: 'us', name: 'United States', capital: 'Washington DC' }); 
} 

我希望這裏都清楚。僅小注:「標識符」字段(在我們的例子中爲「abbr」)在商店中必須是唯一的

刪除項目 - 例如名稱爲「美利堅合衆國」

function removeItem() { 

    var gotNames = function (items, request) { 
     for (var i = 0; i < items.length; i++) { 
     countryStore.deleteItem(items[i]); 
     } 
    } 

    countryStore.fetch({ query: { name: "United States of America" }, queryOptions: { ignoreCase: true }, onComplete: gotNames }); 
} 

刪除所有項目正如你可以看到我已創建查詢時,發現與數據存儲名稱==「美利堅合衆國」的項目。查詢執行後,函數「gotNames」將被調用。 函數gotNames刪除所有查詢返回的項目。

而最後一個函數 - 編輯項目

它類似於刪除功能。只有一個區別:

你應該使用itemFileWriteStore的setValue()方法改變項目屬性:

countryStore.setValue(item, "name", newValue); 

Here - page with working example

+0

荒謬。你會認爲你可以這樣做: dijit.byId('element')。store.load([鍵值對數組] – 2012-02-16 18:22:41

3

我解決了同樣的問題,這個句子,希望它可以幫助別人。

對於道場版本< 1.7

dijit.byId('myId').store.root[{index of select}].innerText='New text'; 

dijit.byId('myId').store.root[{index of select}].value='New Value'; 

對於道場版本> = 1.7

dijit.byId('myId').store.data[{index of select}].name='New Text'; 

dijit.byId('myId').store.data[{index of select}].value='New Value'; 

要改變顯示的文本(當前選中)

dijit.byId('myId').textbox.value='New text'; 

您可以使用Firebug或其他調試控制檯查看此屬性。

+0

這不是一個正確的實現!不要直接修改商店值! – GuyT 2016-09-28 13:38:56

0

屬性「urlPreventCache:真實,clearOnClose:真正的」將強制重新加載

<div data-dojo-type="eco/dojo/data/ItemFileReadStore" data-dojo-props='url:"../json/GetClients", urlPreventCache:true, clearOnClose:true' data-dojo-id="clientStore" ></div> 

<div id=proposalClient data-dojo-type="dijit/form/FilteringSelect" data-dojo-props="store:clientStore, searchAttr:'clientName', required:'true', pageSize:'15'" ></div> 

,然後商店,事件/回調/處理程序,你需要/想重置價值只是這樣做

function func-name() { 
    clientStore.url = "../json/GetClients?param=<your-new-search-conditions>"; 
    clientStore.close(); 
}