2011-09-13 15 views
6

Quiero agrupar varios campos de formulario estándar en un solo campo de formulario personalizado en ExtJS 4. Básicamente, quiero un selector de categoría: cuando selecciona una categoría del primer cuadro combinado, aparece un cuadro combinado secundario que muestra sus subcategorías, y así sucesivamente.¿Cómo crear un campo de formulario personalizado agrupando otros campos de formulario?

Ya he escrito la lógica para esto y está todo encapsulado en un componente personalizado que amplía Ext.form.FieldSet. Pero, quiero usar este componente dentro de un formulario con registros, así que supongo que necesito convertirlo en un campo con funciones como setValue, getValue y un validador. Encontré Ext.form.field.Base que ofrece todo esto, pero no puedo encontrar una manera de combinar los dos componentes armoniosamente (un contenedor como Ext.form.FieldSet + un campo como Ext.form.field.base) .

¿Alguien sabe si y cómo puedo lograr esto?

¡Gracias de antemano!

Respuesta

7

La siguiente solución puede no ser la mejor. Sin embargo, debería funcionar.

Extienda Ext.form.field.Base. A continuación, cree Ext.form.FieldSet en el controlador afterrender y añádalo al campo inputEl. Luego, por supuesto, de valueToRaw, setRawValue campo de anulación, ...

Aquí es un código:

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

¡Gracias! Esto es lo que terminé haciendo. No sé por qué, pero tiene algunos problemas de renderizado: el fieldset no se extenderá al ancho total del contenedor, incluso si usa un diseño de anclaje del 100%. Agregué un 'Ext.apply (this, {listeners: {resize: function() {$ this.container.doLayout();}}});' y resuelve parcialmente el problema. Hack hackear hack. :) Voy a marcar esto como aceptado si a nadie se le ocurre una mejor idea. – liviucmg

2

he logrado esto de una manera diferente, pero exención de responsabilidad: que dejó de funcionar en extjs 4.1

Extiendo Ext.container.Container, luego agregué Ext.form.field.Field como mixin. A partir de ahí implementé getValue/setValue. Todo funcionó muy bien, pero de repente tiene una variedad de problemas en 4.1.

+0

¿Podría publicar su código en algún lugar? De esta forma, tal vez todos podamos hacer que esto funcione. – Misiu

+0

¡Me temo que no puedo porque ya no trabajo con esa compañía y ya no tengo el código! –

+1

Podría intentar reproducirlo en algún momento, pero no he trabajado con EXTjs en un tiempo. Honestamente, no fue muy complejo, básicamente como se describió anteriormente, lo único "complicado" que hice fue agregar Form.field.Field como mixin, por lo que el campo "aggregate" podría comportarse como un campo único normal, una vez getValue y setValue fueron implementados. A partir de ahí, es una cuestión relativamente simple de tratar con los campos secundarios contenidos ... ¡Espero que eso ayude! Pero espero que haya una mejor manera, nunca lo he encontrado. –

Cuestiones relacionadas