Extjs4.1 extjs 4.1如何重置itemselector
我正在使用extjs4.1.1a开发一些应用程序 我有一个由两个组合框和一个项目选择器组成的表单 根据在第一个组合框中选择的值,itemselector将从数据库加载其数据。这很好用 我的问题是,如果我重新选择第一个组合框,新数据将与itemselector中显示的以前的数据一起显示在itemselector中。也就是说,itemselector中显示的以前的数据将保留在那里 例如:名称“test1”由ID80120885000组成。在firstcombobox中选择test1时,itemselector必须显示如下输出 如果“test2”包含ID60905040。在firstcombobox中选择test2时,itemselector必须显示如下输出。 问题是。第一次,如果我从firstcombobox中选择“test1”,输出将按预期进行。如果我从firstcombobox中重新选择“test2”,输出将如下所示 如您所见,以前显示的数据(用红色矩形标记)保留在那里,新数据显示(用绿色矩形标记)。 我希望在itemselector上打印新数据之前,删除第一个组合框(itemselector中以前显示的数据)的每次重新选择。 如何为第一个组合框的每次重新选择重置itemselector?您需要插入Extjs4.1 extjs 4.1如何重置itemselector,extjs4.1,Extjs4.1,我正在使用extjs4.1.1a开发一些应用程序 我有一个由两个组合框和一个项目选择器组成的表单 根据在第一个组合框中选择的值,itemselector将从数据库加载其数据。这很好用 我的问题是,如果我重新选择第一个组合框,新数据将与itemselector中显示的以前的数据一起显示在itemselector中。也就是说,itemselector中显示的以前的数据将保留在那里 例如:名称“test1”由ID80120885000组成。在firstcombobox中选择test1时,itemsel
this.reset();
在插入数据的函数的开头
例如
Ext.override( Ext.ux.ItemSelector, {
setValue: function(val) {
this.reset();
if (!val) return;
val = val instanceof Array ? val : val.split(this.delimiter);
var rec, i, id;
for (i = 0; i < val.length; i++) {
var vf = this.fromMultiselect.valueField;
id = val[i];
idx = this.toMultiselect.view.store.findBy(function(record){
return record.data[vf] == id;
});
if (idx != -1) continue;
idx = this.fromMultiselect.view.store.findBy(function(record){
return record.data[vf] == id;
});
rec = this.fromMultiselect.view.store.getAt(idx);
if (rec) {
this.toMultiselect.view.store.add(rec);
this.fromMultiselect.view.store.remove(rec);
}
}
}
});
Ext.override(Ext.ux.ItemSelector{
设置值:函数(val){
这是reset();
如果(!val)返回;
val=val数组实例?val:val.split(this.delimiter);
var rec,i,id;
对于(i=0;i
你明白了吗?
当您选择该组合框时,项目选择器的第一个stoe在存储加载后为空,并且您通过参数
比如说
store.load(null)
,
store.proxey.url='jso.php?id='+combobox.getrawvalue(),
store.load()代码>
这样,当您在上面代码中使用listeners时,在组合框中选择一个值,然后在将一些值传递给json.php后,在组合框中选择时间第一个存储为get null的某个值,然后使用response存储load,以便删除旧数据并在该存储中加载新数据
如果您发布您的代码,我将给出正确的代码您应该通过removeAll
命令从itemselector
的存储中删除所有项目。之后,您应该加载项选择器的存储
itemselector.store.removeAll();
itemselector.store.load();
我在ExtJS4.2.1中遇到了同样的问题。我通过在数据存储上调用reload()
,然后在数据存储的reload()
回调中的项选择器上使用空字符串调用setValue()
,使其正常工作
Ext.create("Ext.form.field.ComboBox", {
// Other properties removed for brevity
listeners: {
change: function(field, newValue, oldValue, eOpts) {
Ext.getStore("ExampleStore").reload({
callback: function() {
Ext.getCmp("ExampleItemSelector").setValue("");
}
});
}
}
});
Ext.create("Ext.data.Store", {
storeId: "ExampleStore",
// Other properties removed for brevity
});
Ext.create("Ext.form.FormPanel", {
// Other properties removed for brevity
items:[{
xtype: "itemselector",
id: "ExampleItemSelector",
// Other properties removed for brevity
}]
});
对于任何好奇的人来说,我确信item selector的populateFromStore()
函数中有一个bug。调用函数时,它会将绑定存储(store
)中的所有值盲目地添加到内部存储(fromStore
)。我怀疑在调用fromStore.add()
之前应该调用fromStore.removeAll()
。下面是ItemSelector.js中的相关代码
populateFromStore: function(store) {
var fromStore = this.fromField.store;
// Flag set when the fromStore has been loaded
this.fromStorePopulated = true;
fromStore.add(store.getRange());
// setValue waits for the from Store to be loaded
fromStore.fireEvent('load', fromStore);
},
编辑2013年12月18日
如果已在项目选择器上配置了任何回调事件(例如,change
),则在调用setValue(“”
)时,可能需要暂时禁用这些事件。例如:
var selector = Ext.getCmp("ExampleItemSelector");
selector.suspendEvents();
selector.setValue("");
selector.resumeEvents();
我也遇到了同样的问题,最后我决定修改extjs源代码,而不是像extjs本身在文件开头所说的那样认为这是一个大问题
请注意,此控件很可能仍作为示例,而不是核心Ext表单
控制然而,API将在未来的版本中进行更改,因此现在还不应该更改
此时被视为最终的、稳定的API
基于此,正如jstricker猜测的(遗憾的是,我没有阅读,花了一段时间才得出相同的结论),在fromStore.add()之前添加fromStore.removeAll()解决了这个问题
除此之外(但我认为这可能也很有趣),此外,我还在MultiSelect配置(在createList内部)中添加了listConfig:me.listConfig,这样就可以格式化“itemselector”选项列表配置中的每个项目附加选项(如图像等),如(不真实的)文档。以上任何解决方案都可以解决我的问题。
我从Sencha论坛找到了解决方案。
在itemselector.js文件中,更改下面标记的行
populateFromStore: function(store) {
var fromStore = this.fromField.store;
// Flag set when the fromStore has been loaded
this.fromStorePopulated = true;
// THIS LINE BELOW MUST BE CHANGED!!!!!!!!!!!!
fromStore.loadData(store.getRange()); //fromStore.add(store.getRange());
// setValue waits for the from Store to be loaded
fromStore.fireEvent('load', fromStore);
},
需要重置ItemSelector
中使用的存储,这可以通过如下设置空对象来完成。还需要调用ItemSelector
组件的clearValue()
方法
store.setData({});
ItemSelectorComponent.clearValue();
你好,伊恩·阿特金。谢谢你的回复。.我正在从数据库中提取数据。我没有使用任何单独的函数来加载数据。我正在使用第一个组合框的“选择”事件处理程序来重新加载数据。以下是我用来将数据重新加载到iteselector的代码。侦听器:{select:function(combo,value){itemserial=Ext.getCmp('itemselector-field');itemserial.reset();itemserial.sto