comment reconfigurer la grille avec de stocker et de colonnes

Je suis en train d'écrire un générique composant du panneau avec un champ de recherche de texte, un bouton de recherche et une grille présentant les résultats. Ce que je recherche est un composant générique et vous pouvez créer différentes instances de celle-ci avec plus ou moins de colonnes, différents titres de colonne et différente de la logique de recherche.

J'ai créé ExtJS4 code avec Sencha Architect 2 où ce genre de choses se présente comme suit:

initComponent: function() {
    var me = this;

    Ext.applyIf(me, {
        items: [
            {
                xtype: 'textfield',
                itemId: 'txtObjSearch',
                fieldLabel: 'Search for'
            },
            {
                xtype: 'button',
                itemId: 'btnSearch',
                icon: '/rhidmoplus/icons/zoom.png',
                text: 'Search'
            },
            {
                xtype: 'gridpanel',
                itemId: 'gridResultObjects',
                title: '',
                store: 'testStore',
                colspan: 2,
                columns: [
                    {
                        xtype: 'gridcolumn',
                        dataIndex: 'MSKEYVALUE',
                        text: 'ID'
                    },
                    {
                        xtype: 'gridcolumn',
                        dataIndex: 'DISPLAYNAME',
                        text: 'Displayname'
                    }
                ],
                viewConfig: {
                    itemId: 'gridView'
                }
            }
        ]
    });

    me.callParent(arguments);
},

Le magasin et les 2 colonnes ne sont que des simulacres. Je veux offrir le magasin réel et le réel de configuration de colonne dans le constructeur du composant personnalisé. J'ai trouvé le GridPanel.reconfigurer (http://docs.sencha.com/ext-js/4-1/#!/api/Ext.de la grille.Panneau-méthode-reconfigure) méthode qui semble s'adapter parfaitement à mes besoins.
Toutefois, le code suivant génère une erreur:

    ////////////////////////
    //Prepare store
    ////////////////////////

    //prepare fields and columns
    var __fields = [];
    var __columns = [];

    for (var jj=0; jj<config.columns.length; jj++) {
        var item2 = {};
        var item = [];
        //for fields
        item.name = config.columns[jj].title;
        __fields.push (item);
        //for columns
        item2.xtype = 'gridcolumn';
        item2.dataIndex = config.columns [jj].dataIndex;
        item2.text = config.columns [jj].title;
        __columns.push (item2);    
    }

    console.debug ('columns.length = ' + __columns.length + ', fields.length = ' + __fields.length);

    var sm = new Ext.selection.RowModel();
    //sm.bindComponent (grid.getView ());

    var __store = Ext.create ('Ext.data.Store', {
        storeId: config.storeId,
        fields: __fields,
        selModel: sm,
        proxy: {
            type: 'ajax',
            url: '/rhidmo/rest/ktec_js_searchUtils',
            reader: {
                type: 'json',
                root: 'entries'
            }
        }
    });

    grid.reconfigure (__store, __columns);

qui est:

Uncaught TypeError: Cannot read property 'longueur' undefined

dans la méthode onLastFocusChanged de la sélection de modèle. Si je passe null comme premier argument de reconfigurer ensuite, cela n'arrive pas, mais je voudrais créer dynamiquement un magasin (sinon, chaque instance de mon composant utilise le même magasin, qui n'est certainement pas bon).

Peut-être que ma configuration de la boutique n'est pas correct, mais je l'ai copié à partir du code Sencha Architect crée, alors ça ne peut être que mauvais.

Merci de tout soupçon.
Cheers
Kai

========================================

Salut, maintenant changé le code:

//prepare fields and columns
var __fields = [];
var __columns = [];

for (var jj=0; jj<config.columns.length; jj++) {
    var item2 = Ext.create ('Ext.grid.column.Column', {
        dataIndex: config.columns [jj].dataIndex,
        text: config.columns [jj].title
    });
    var item = Ext.create ('Ext.data.Field', {
        name: config.columns[jj].title
    });
    __fields.push (item);
   __columns.push (item2);    
}

et je reçois toujours le même message d'erreur:

Uncaught TypeError: Cannot read property 'length' of undefined
Ext.define.onLastFocusChangedext-all-debug.js:89284
Ext.define.setLastFocusedext-all-debug.js:59431
Ext.define.clearSelectionsext-all-debug.js:59543
Ext.define.refreshext-all-debug.js:59523
Ext.define.bindext-all-debug.js:59143
Ext.define.bindStoreext-all-debug.js:60584
Ext.define.bindStoreext-all-debug.js:78007
Ext.define.reconfigureext-all-debug.js:78033
Ext.define.configureGenericSearchPanel.js:141
Ext.define.onStoreTestPanelRenderMainController.js:471
fireext-all-debug.js:10658
  • Où exactement erreur qui se passe? Pouvez-vous vérifier la pile?
  • Il y a deux choses qui me permettrait de corriger avant que vous seriez en mesure de résoudre complètement ce problème. La première, et qu'important, c'est que je conseillerais de le mettre à la textfield et button dans un tbar. Le second, qui est le plus important, une colonne de la grille de configuration nécessite Ext.grid.column.Column et non pas un objet vide (comme votre item2). Vous devriez vraiment avoir var item2 = Ext.create('Ext.grid.column.Column'); et mieux encore, de fournir une config à cette méthode de création plutôt que sur l'ajout de la colonne configs manuellement plus tard.
  • veuillez voir la description mise à jour
InformationsquelleAutor kaidentity | 2012-07-15