0

我正在使用 extjs 4.1.1a 开发一些应用程序。

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

根据在第一个组合框中选择的值,itemselector 将从数据库中加载其数据。这工作正常。

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

例如:名称“test1”由 ids 801,2088,5000 组成。在第一个组合框 itemselector 中选择 test1 时必须显示如下输出。

如果“test2”由 ids 6090,5040 组成。在第一个组合框 itemselector 中选择 test2 时必须显示如下输出。

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

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

4

7 回答 7

1

您应该通过该命令从store中删除所有项目。之后你应该的.itemselectorremoveAllloadstoreitemselector

itemselector.store.removeAll();
itemselector.store.load();
于 2013-08-30T13:46:04.550 回答
1

上面的任何解决方案都可以解决我的问题。我从 Sencha 论坛找到了解决方案。 https://www.sencha.com/forum/showthread.php?142276-closed-Ext-JS-4.0.2a-itemselector-not-reloading-the-store

在 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);
},
于 2015-07-22T13:30:12.173 回答
0

你需要插入...

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);
            }
        }
    }
});
于 2012-12-20T07:59:58.883 回答
0

你明白了吗?当您通过参数存储加载后选择项目选择器的组合框第一个 stoe 为空时

例如

store.load(null), store.proxey.url='jso.php?id='+combobox.getrawvalue(), store.load();

就像那样,所以当你在你的组合框中选择一个值时,你在上面的代码中使用了一个监听器来连接你的组合框,在你将一些值传递给 json.php 之后,在组合框中选择你的某个值,该时间第一次存储为空然后使用响应存储负载,以便删除旧数据并在该存储中加载新数据

如果你发布你的代码,我会给出正确的代码

于 2013-03-18T14:20:52.323 回答
0

我遇到了同样的问题,最后我决定修改 extjs 源代码,不认为这是一个大问题,因为 extjs 本身在文件开头就说

请注意,此控件很可能仍作为示例,而不是核心 Ext 表单控件。但是,该 API 将在未来的版本中发生变化,因此目前不应被视为最终的稳定 API。

基于此,正如 jstricker 猜测的那样(遗憾的是,我没有阅读并花了一段时间才得出相同的结论),在 fromStore.add() 之前添加 fromStore.removeAll() 可以解决问题。

在问题之外(但我认为它也可能很有趣),此外,我还在 MultiSelect 配置中添加了 listConfig: me.listConfig(在 createList 中),这样就可以格式化每个项目的附加选项(例如图像,等)在“itemselector”中设置选项 listConfig,如(不现实的)文档中所述。

于 2014-01-16T14:52:06.090 回答
0

我在 ExtJS 4.2.1 中遇到了同样的问题。我通过调用reload()数据存储,然后在数据存储回调setValue()中的项目选择器上使用一个空字符串来使其工作。reload()

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
    }]
});

对于任何好奇的人,我相当确信项目选择器的populateFromStore()功能中存在错误。调用该函数时,它会盲目地将绑定存储 ( store) 中的所有值添加到内部存储 ( fromStore)。我怀疑应该在调用 tofromStore.removeAll()之前调用 to fromStore.add()。这是来自 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();
于 2013-12-17T22:18:20.957 回答
0

需要重置其中使用的存储ItemSelector,可以通过设置如下所示的空对象来完成。还需要调用组件clearValue()的方法ItemSelector

store.setData({});
ItemSelectorComponent.clearValue();
于 2019-03-07T07:39:14.487 回答