extjs 组合框 afterrender() 一起调用导致异步 ajax 调用

Posted

技术标签:

【中文标题】extjs 组合框 afterrender() 一起调用导致异步 ajax 调用【英文标题】:extjs combobox afterrender() called together leading to asynchronous ajax calls 【发布时间】:2016-09-27 06:02:17 【问题描述】:

我正在使用 Java Spring 和 ExtJS 开发一个应用程序。前端包含一个面板,其中包含一些字段,包括 3 个组合框。为了填充组合框,我定义了一个在 ComboBox afterRender 上触发的函数。我为每个组合框都有一个商店(每个组合框都是从不同的表中填充的)。

问题是当页面被渲染时,函数被调用了 3 次但只填充了第 3 个组合框,或者返回的 JSON 字符串只包含最后一个组合框的值。实际上,所有 3 个组合框的请求都已发送,但只处理最后一个请求。

谁能告诉我如何处理这个问题?

这就是我挑战组合框的方式。


    xtype: 'combobox',
    x: 300,
    y: 70,
    store: 'TasksStr',
    msgTarget: 'side',
    displayField: 'label',
    valueField: "value",
    itemId: 'TaskRef',                                  
    fieldLabel: 'Task Ref',
    name: 'taskRef'
 //Similarly 2 more combo boxes for Project and Status

这是控制器:

init: function(application)               
    this.control(
        "#TaskRef": 
            afterrender: this.onComboboxAfterRender,
            select: this.onFormBlur                
        ,
        "#ProjectRef": 
                afterrender: this.onComboboxAfterRender,
                select: this.onFormBlur                
        ,
        "#StatusRef": 
            afterrender: this.onComboboxAfterRender,
            select: this.onFormBlur                
        
    );
 

这是商店:

Ext.define('MainApp.store.TasksStr', 
    extend: 'Ext.data.Store',

    requires: [
        'MainApp.model.Model'
    ],

    constructor: function(cfg) 
        var me = this;
        cfg = cfg || ;
        me.callParent([Ext.apply(
            storeId: 'TasksStr',
            model: 'MainApp.model.Model',
            proxy: 
                type: 'ajax',
                url: 'http://localhost:8080/project/Tasks',
                reader: 
                    type: 'json',
                    root: 'data',
                    totalProperty: 'count'
                
            
        , cfg)]);
    
);

这是java中的控制器:

@RequestMapping(value="/id")
public String getElanLUT(@PathVariable("id") String Id, ModelMap model )
    System.out.println(Id);
    try
        ABCDao.set(Id);
        List<ABC> List = Dao.getABC();
        model.addAttribute("data", List);
        model.addAttribute("success", true);
        model.addAttribute("count", List.size());
    catch(Exception e)
        model.addAttribute("success", false);
        e.printStackTrace();
    

    return "jsonTemplate";

运行此代码时,java 控制台会打印所有 3 个 Id,但返回的值只是第 3 个。

提前致谢!

【问题讨论】:

几个问题,你说的函数被调用3次是指Controler#onComboboxAfterRender吗?其他组合框如何调用(itemid),如果您只为TaskRef 添加了控制器,则该方法应该只被调用一次。您的控制器设置方式有问题。 TaskRef 只是 1 个组合框。我还有 2 个带有各自 itemid 的组合框。 afterRender() 被同时调用,但只有最后一个调用在后端处理。 但是如果你的控制器选择器只用于#TaskRef,afterRender 怎么会被调用三次呢? 对不起,我没有提供控制器下的所有代码。实际上,我的机器中有 3 个控制器选择器。示例:1.Task,2.Project,3:Status。我已经更新了代码。 【参考方案1】:

您需要为所有 3 个组合框创建商店实例。

xtype: '组合框', ×:300, y: 70, 商店:Ext.create('MainApp.store.TasksStr'), msgTarget: '边', 显示字段:'标签', 值字段:“值”, itemId: 'TaskRef', fieldLabel:'任务参考', 名称:'taskRef'

【讨论】:

谢谢。但我有他们的个人商店。

以上是关于extjs 组合框 afterrender() 一起调用导致异步 ajax 调用的主要内容,如果未能解决你的问题,请参考以下文章

网格内的 ExtJS 组合框

ExtJS 组合框和过滤存储

ExtJS 组合框:值字段在 postdata 中不可用

在 extjs 网格中只为一行添加组合框

extjs 表单元素中的 Extjs 组合框在禁用时未灰显

ExtJS 组合框不呈现