Extjs4.1 extjs 4.1如何重置itemselector

Extjs4.1 extjs 4.1如何重置itemselector,extjs4.1,Extjs4.1,我正在使用extjs4.1.1a开发一些应用程序 我有一个由两个组合框和一个项目选择器组成的表单 根据在第一个组合框中选择的值,itemselector将从数据库加载其数据。这很好用 我的问题是,如果我重新选择第一个组合框,新数据将与itemselector中显示的以前的数据一起显示在itemselector中。也就是说,itemselector中显示的以前的数据将保留在那里 例如:名称“test1”由ID80120885000组成。在firstcombobox中选择test1时,itemsel

我正在使用extjs4.1.1a开发一些应用程序

我有一个由两个组合框和一个项目选择器组成的表单

根据在第一个组合框中选择的值,itemselector将从数据库加载其数据。这很好用

我的问题是,如果我重新选择第一个组合框,新数据将与itemselector中显示的以前的数据一起显示在itemselector中。也就是说,itemselector中显示的以前的数据将保留在那里

例如:名称“test1”由ID80120885000组成。在firstcombobox中选择test1时,itemselector必须显示如下输出

如果“test2”包含ID60905040。在firstcombobox中选择test2时,itemselector必须显示如下输出。

问题是。第一次,如果我从firstcombobox中选择“test1”,输出将按预期进行。如果我从firstcombobox中重新选择“test2”,输出将如下所示

如您所见,以前显示的数据(用红色矩形标记)保留在那里,新数据显示(用绿色矩形标记)。 我希望在itemselector上打印新数据之前,删除第一个组合框(itemselector中以前显示的数据)的每次重新选择。 如何为第一个组合框的每次重新选择重置itemselector?

您需要插入

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