我试图通过Memory和ObjectStore异步更新Select字段。这不起作用。在创建Select元素之前将数据设置为Memory对象可以正常工作。创建Select元素后更新Memory对象不再起作用。
示例代码:
require([
"dojo/ready",
"dijit/form/Select",
"dojo/store/Memory",
"dojo/store/Observable",
"dojo/data/ObjectStore",
'dojo/domReady!'
], function(ready, Select, Memory, Observable, ObjectStore, dom){
ready(function() {
var mymem = new Memory();
var myobs = new Observable(mymem);
var mystore = new ObjectStore({ objectStore: myobs });
/* updating memory here works :) */
//mymem.setData([ { id: 2, label: 'qwertz2' }, { id: 3, label: 'qwertz3' } ]);
var s = new Select({
store: mystore
}, 'appsAdminQueueContainer');
s.startup();
/* updating memory here doesn't work :( */
mymem.setData([ { id: 2, label: 'qwertz2' }, { id: 3, label: 'qwertz3' } ]);
});
}
);
真实的例子:https://jsfiddle.net/mirQ/ra0dqb63/5/
这是一个错误还是有一个解决方案,可以在创建后更新Select字段的内容 - 而无需直接访问Select字段?
更新
感谢您的回复。
dojo/ready
只是一个错过的遗留物,同时简化了我的代码,抱歉。 ObjectStore
是不是必要的。谢谢你清理。更新/扩展的问题描述:
我正在使用网格。起初我使用dojox/grid/DataGrid
,但之后我切换到dgrid
。一切都运作良好,但我想使用dijit.form.Select
作为一列的编辑器。如果数据是静态的,这也很有效。但在一列中,我必须从服务器读取动态数据。此数据以JSON格式提供。
首先,我尝试使用dojo/data/ItemFileReadStore
来解决这个问题 - 这很有效。但它已被弃用,我需要为该列实现一个格式化程序,该格式化程序必须能够访问从服务器读取的相同JSON数据。我不再拥有该解决方案的代码,但它没有用。我无法从格式化程序函数中成功查询数据。
然后我切换到Memory
和xhr
。服务器的响应是在创建Memory对象之后(并且,看起来,在创建Select之后),因此我不得不使用setData
将我加载的数据带入商店。由于Select只是网格的编辑器,因此我无权访问对象本身,以便在更新数据后重新设置存储。
我希望我的扩展描述能让我的真正问题更加清晰。在此先感谢您的帮助!
的Mirko
答案 0 :(得分:0)
这对我有用:
SELECT Count(`r`.`review`) AS `total_reviews`,
`c`.`company`
FROM `reviews` AS `r`
JOIN `companies` AS `c`
ON `c`.`id` = `r`.`companyid`
值得注意的变化:
require([
'dijit/form/Select',
'dojo/store/Memory',
'dojo/store/Observable',
], function (Select, Memory, Observable) {
var mymem = new Memory({
data: [{
id: 2,
label: 'qwertz2'
}, {
id: 3,
label: 'qwertz3'
}]
});
var myobs = new Observable(mymem);
var s = new Select({
labelAttr: 'label',
store: myobs
}, 'appsAdminQueueContainer');
s.startup();
myobs.add({ id: 4, label: 'qwerty' });
});
。 dojo/ready
回调已经等待加载模块,只要这个脚本位于正文的底部,就不需要等待DOM加载。require
商店适配器。 dojo/data
也支持dijit/form/Select
(如果我没记错的话,则为1.8)。这也可能是观察不起作用的原因。唯一的区别是dojo/store
必须在labelAttr
上指定,因为Select
没有标签属性的概念。dojo/store
。 setData
不会激怒观察者。 setData
完全重置商店的数据,为了反映这一点,您需要在完全选择时实际重置商店(如果您使用1.9,则需要调用setData
,而不是setStore
或更早,因为Select从未正确更新以支持set('store', ...)
API直到1.10)。set
的主要原因是由于在实际存储数据之前创建了商店,因此使用setData
商店可能会大大简化您的案例dojo-smore的实施。它基本上会重新添加RequestMemory
url
支持但dojo/data/ItemFileReadStore
没有支持。