2011-09-13 22 views
6

Desidero raggruppare diversi campi modulo standard in un campo modulo singolo personalizzato in ExtJS 4. Fondamentalmente, desidero un selettore di categorie: quando selezionate una categoria dalla prima casella combinata, una casella combinata secondaria mostra le sue sottocategorie e così via.Come creare un campo modulo personalizzato raggruppando altri campi modulo?

Ho già scritto la logica per questo ed è tutto incapsulato in un componente personalizzato che estende Ext.form.FieldSet. Ma, voglio utilizzare questo componente all'interno di un modulo con i record, quindi suppongo di doverlo trasformare in un campo con funzioni come setValue, getValue e un validatore. Ho trovato Ext.form.field.Base che offre tutto questo, ma non riesco a trovare un modo per combinare armoniosamente i due componenti (un contenitore come Ext.form.FieldSet + un campo come Ext.form.field.base) .

Qualcuno sa se e come posso realizzare questo?

Grazie in anticipo!

risposta

7

La seguente soluzione potrebbe non essere la migliore. Tuttavia dovrebbe funzionare.

Estendere Ext.form.field.Base. Quindi creare Ext.form.FieldSet nel gestore afterrender e aggiungerlo al campo inputEl. Poi, naturalmente, di valueToRaw, setRawValue campo override, ...

Ecco un codice:

Ext.define('Ext.ux.form.field.MyCoolField', { 
    extend:'Ext.form.field.Base', 
    requires: ['Ext.util.Format', 'Ext.XTemplate'], 
    fieldSubTpl: [ 
     '<div id="{id}" class="{fieldCls}"></div>', 
     { 
      compiled: true,   
      disableFormats: true  
     }   
    ], 

    isFormField: true, 
    submitValue: true, 
    afterRender: function() { 
     this.callParent(); 

     this.fieldSet = Ext.create('Ext.form.FieldSet', { 
      items: [{ 
       // ... config of the first item 

       // The following configs should be set to false. It's important. 
       // Otherwise form will assume this items as its fields 
       isFormField: false, 
       submitValue: false 
     }); 
     this.fieldSet.render(this.inputEl); 
    }, 

    // and here overriding valueToRaw and so on 
    // ... 
}); 
+1

Grazie! Questo è quello che ho finito per fare. Non so perché, ma presenta alcuni problemi di rendering: il fieldset non si estenderà fino alla larghezza del contenitore, anche quando si utilizza un layout di ancoraggio al 100%. Ho aggiunto un 'Ext.apply (questo, {listener: {ridimensiona: function() {$ this.container.doLayout();}}});' e risolve parzialmente il problema. Hack Hack Hack. :) Segnalo come accettato se nessun altro ha un'idea migliore. – liviucmg

2

ho realizzato questo in un modo diverso, ma disclaimer: ha smesso di funzionare in ExtJS 4.1

Ho esteso Ext.container.Container, quindi ho aggiunto Ext.form.field.Field come mixin. Da lì ho implementato getValue/setValue. Funzionava tutto alla grande, ma improvvisamente ha una serie di problemi in 4.1.

+0

Potresti pubblicare il tuo codice da qualche parte? In questo modo forse tutti possiamo farlo funzionare – Misiu

+0

Temo di non poterlo fare perché non lavoro più con quella compagnia e non ho più il codice! –

+1

Potrei provare a riprodurlo a un certo punto, ma non ho lavorato con EXTjs tra un po '. Onestamente non è stato molto complesso, anche se, sostanzialmente come descritto sopra, l'unica cosa "difficile" che ho fatto è stato aggiungere Form.field.Field come mixin, in modo che il campo "aggregato" potesse comportarsi come un normale campo singolo, una volta getValue e setValue sono stati implementati. Da lì è relativamente semplice trattare con i campi figlio contenuti ... Spero che questo aiuti! Ma spero che ci sia un modo migliore, non l'ho mai trovato. –

Problemi correlati