Extjs combobox afterrender () llamados juntos dando lugar a llamadas asincrónicas ajax

0

Estoy desarrollando una aplicación usando Java Spring y ExtJS. La parte frontal contiene un panel con algunos campos que incluyen 3 cuadros combinados. Para llenar los cuadros combinados, he definido una función que se activa en ComboBox afterRender. Tengo una tienda para cada cuadro combinado (cada cuadro combinado se llena desde diferentes tablas).

El problema es que cuando se representa la página, la función se llama 3 veces pero solo se llena el tercer cuadro combinado, o la cadena JSON devuelta contiene solo el valor del último cuadro combinado. En realidad, se envía la solicitud de los 3 cuadros combinados, pero solo se procesa la última solicitud.

¿Alguien puede darme una idea de cómo manejar este problema?

Así es como desafié un cuadro combinado.

{
    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

Este es el controlador:

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

Esta es la tienda:

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

Este es el controlador en 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";
}

Mientras se ejecuta este código, la consola para java imprime los 3 Id, pero el valor devuelto es solo el tercero.

Gracias por adelantado.!

4
  • Algunas preguntas, cuando dices que la función se llama tres veces, ¿a Controler#onComboboxAfterRenderqué te refieres ? ¿Cómo se llaman los otros cuadros combinados (itemid)? Si agregó el controlador TaskRefsolo, el método solo debería haberse llamado una vez. Hay algo mal en la forma en que está configurado el controlador. 27 de septiembre de 2016 a las 17:28
  • TaskRef es solo un cuadro combinado. Tengo 2 cuadros combinados más con los respectivos ítems. afterRender () se llama simultáneamente pero solo la última llamada se procesa en el back-end. 28 de septiembre de 2016 a las 4:57
  • Pero, ¿cómo se llama al afterRender tres veces si su selector de controlador es solo para #TaskRef? 28 de septiembre de 2016 a las 17:27
  • Oh, lo siento, no he proporcionado todos los códigos bajo el controlador. En realidad, hay 3 selectores de controlador en mi máquina. Ejemplo: 1. Tarea, 2. Proyecto, 3: Estado. He actualizado el código. 29 de septiembre de 2016 a las 4:39
0

Debe crear instancias de tienda para los 3 cuadros combinados.

    {
        xtype: 'combobox',
        x: 300,
        y: 70,
        store: Ext.create('MainApp.store.TasksStr'),
        msgTarget: 'side',
        displayField: 'label',
        valueField: "value",
        itemId: 'TaskRef',                                  
        fieldLabel: 'Task Ref',
        name: 'taskRef'
    }
1
  • Gracias. Pero tengo tiendas individuales para ellos. 29 de septiembre de 2016 a las 9:58