使用异步数据更新Dojo Dijit FilteringSelect存储

时间:2012-02-16 19:43:33

标签: php javascript zend-framework dojo

我在Intranet上下文中使用Zend + Dojo表单。我们需要在表单上更改选定状态时更新县列表。使用HTML,您只需解析json响应(或只提供选项的html片段)并更新select的innerhtml。但是,事实证明,在Dojo中这样做非常复杂。

简而言之,我已经定义了一个通用方法,允许您将onBlur更新设置为表单字段。这链接到一个Controller函数,该操作使用函数参数调用数据库,并返回单例响应(我们已经处理好了)或列表响应。如果我们返回一个列表,我们需要改变带有该列表的select中的选项。

到目前为止,这一切都很好;我们得到一个有效的json响应,在response.data中有一个很好的列表。这就是问题所在。我怎样才能简单地更新现有的商店(检查显示它是_comboBoxDataStore)?我无法使用不同类型的商店声明选择,因为它是自动生成的。

有没有办法强行换掉商店?主要的关键是无论我做什么,它必须在Internet Explorer中工作;我对Firefox的使用只是为了更好地洞察我正在使用的对象。

作为一个附带问题,有谁知道为什么_comboBoxDataStore无法更新?其他框架允许非常无缝地更新商店,例如extJS。是否有任何理由在设计组合框的限制因此无法更新,这是从原始HTML下降?或者我错过了一个明显的解决方案,不涉及杂乱的一系列深奥的对象?

4 个答案:

答案 0 :(得分:1)

根据RiverC的帖子,我更新组合的方法可以正常工作:

, updateData : function(data) {
    var storeData = {data: data, id:'attrFilterStore'};
    var newStore = new dojo.data.ItemFileWriteStore({data: data});
    this.element.store = newStore;
    this.element.startup();
}

this.element ”是对 FilteringSelect 对象的引用。
方法“ updateData ”是ajax请求的回调函数,它接收带有RiverC结构的JSON。

答案 1 :(得分:0)

正如它所发生的那样,这是可能的,虽然我没有看过的教程显示它实际上是多么容易。

确保这是某个地方:

dojo.require("dojo.data.ItemFileWriteStore");

然后,无论您的filteringSelect如何形成,您都可以执行以下操作:

newStore = new dojo.data.ItemFileWriteStore({
    data:{
         identifier: 'id',
         label: 'name',
         items: response.data
    }
});

filteringSelect.store = newStore;
filteringSelect.startup();

答案 2 :(得分:0)

如果您可以控制_comboBoxDataStore的创建,则可以在该商店上将clearOnClose设置为true。然后,您可以关闭该存储并将url或data属性设置为新数据(请注意,仅在dojo 1.4及更高版本支持clearOnClose之后使用data属性)。这将使用新数据

自动更新select / combobx小部件

举个例子,见: http://soularis999.blogspot.com/2011/03/reloading-dojodataitemfilereadstore.html

如果您无法设置clearOnClose(由于Zend框架拥有它而没有修改该行为的选项),您可以创建一个新的数据存储区并将组合框的数据存储区设置为新创建的数据存储区。 dijit filteringselect和combobox提供了一个你可以修改的商店属性。

作为一种完全不同的方法,您可能希望使用dojo过滤小部件的“查询”属性来探索此类用例 - 它们非常有用并且减少了您需要执行的代码和管理量。

通过修改过滤选择的查询过滤器,查看下面的网址,了解如何根据国家/地区选择更改状态的示例 http://livedocs.dojotoolkit.org/dijit/form/FilteringSelect

另外,根据你的用例描述,听起来像dijit filteringSelect可能是一个比组合框更好的小部件选择(因为它是一个县的列表,你希望用户能够进入列表中不存在的任何县)?

答案 3 :(得分:0)

您甚至可以使用选项..

var fldSelect = dijit.byId("fieldSelect");
fldSelect.options = fldoptions;
fldSelect.startup();

其中fldoptions是需要填充的新数据。请记住:不要忘记调用fldSelect.startup(),否则数据将不会更新。