2011-04-22 18 views
28

Con ExtJS 3.x, pude usar la propiedad "fields" de una Tienda, pero parece que con ExtJS 4 tengo que usar absolutamente un Modelo. Está bien, pero en mi caso, no es un modelo estático, y tengo que definir los campos sobre la marcha y, a veces para cambiarlos.Modelo dinámico con ExtJS 4

Podría volver a crear un modelo, pero necesito usar un nombre diferente ya que aparentemente no es posible modificar un modelo existente, ni eliminarlo. Si trato de usar Ext.regModel con el mismo nombre, ExtJS falla.

Gracias por su ayuda!

Respuesta

20

4.1 ACTUALIZACIÓN:

Como una actualización ... en 4.1 ahora hay un método estático setFields que se puede utilizar para definir los campos del modelo de prototipo. Funciona bien en el método init de un controlador.

Cuando hice esto, quería tener algunos campos estáticos definidos en la clase de modelo y luego configurarlos de forma más dinámica. Lamentablemente, el nuevo setFields método reemplaza todos los campos con el argumento, aunque fue bastante fácil de manejar.

este ejemplo se utiliza el patrón MVC, donde mi modelo y la tienda se incluyen en el controlador de model matriz y store array (proveerme de los captadores prácticos utilizados a continuación):

Ext.define('ST.controller.Main', { 
    extend: 'Ext.app.Controller', 

    models: ['User', 'Reference'], 

    stores: ['CurrentUser', 'PermissionRef'], 

    views: ['MainPanel'], 

    init: function() { 
     var me = this; 

     me.getPermissionRefStore().on('load', function(store, records) { 
      var model = me.getUserModel(); 
       // this returns the static fields already defined 
       // in my User model class 
       fields = model.prototype.fields.getRange(); 

      // add the permission options (dynamic fields) to the static fields 
      Ext.each(records, function(permission) { 
       fields.push({name: permission.get('name'), type: 'bool'}); 
      }); 

      // 4.1 method to update the User model fields 
      model.setFields(fields); 

      // now load the current user (it will use the updated model) 
      me.getCurrentUserStore().load(); 

     }); 

    } 

}); 

El User modelo y CurrentUser tienda son creados exactamente igual que los modelos y tiendas regulares y no dinámicos, e incluidos en sus respectivas matrices de controladores, el modelo 'Usuario' simplemente no tiene los campos dinámicos que se agregan como se muestra arriba.

+0

Gracias por agregar la actualización – Jom

+0

¿Por qué no agrega los nuevos campos directamente a 'fields'' MixedCollection'? ¿Hay algún procesamiento necesario realizado por el método 'setFields'? Quiero decir, además de crear la instancia 'Field', en tu caso. – rixo

3

Aquí hay un ejemplo muy simple. Sólo tiene que utilizar un Ext.data.Store normal, pero en lugar de un modelo, especifique la propiedad campos:

// you can specify a simple string ('totally') 
// or an object with an Ext.data.Field ('dynamic') 
var fields = ['totally', {name : 'dynamic', type : 'string'}]; 
var newStore = new MyApp.store.Object({ 
    fields : fields 
    // other options like proxy, autoLoad... 
}); 

no especifica una propiedad de modelo - parece que sería reemplazar la propiedad campos.

También quería cambiar las columnas y el contenido de una red existente de forma dinámica:

// reconfigure the grid to use the new store and other columns 
var newColumns = [ 
    {header: 'Totally', dataIndex: 'totally'}, 
    {header: 'Dynamic', dataIndex: 'dynamic'} 
]; 
myGrid.reconfigure(newStore, newColumns); 

Desde el 4 de documentación Ext JS acerca de la propiedad "campos" de Ext.data.Store:

Esto puede ser utilizado en lugar de especificando una configuración de modelo. Los campos deben ser un conjunto de Ext.data.Field objects de configuración. La tienda creará automáticamente un Ext.data.Model con estos campos. En en general, se debe evitar esta opción de configuración , existe para compatibilidad con versiones anteriores . Para cualquier cosa más complicada, como especificando una propiedad de identificación particular o asociaciones , se debe definir y especificar un modelo de datos Ext. para las configuraciones del modelo .

Tenga cuidado: Sencha puede eliminarlo en el futuro.

+0

Tenga cuidado aquí: si establece los campos en una tienda, mientras ignora el modelo, y tiene un campo Id personalizado, fallará. Los registros de su tienda tendrán su Id establecido, pero no podrán devolver el Id a través de getId() porque no conocerán el Id. Personalizado. No estoy seguro si esto es un error, pero lo reporté de todos modos http://www.sencha.com/forum/showthread.php?280160-model.getId()-with-custom-IdProperty-fails-when-and-store -fields-set-via-metaData & p = 1024289 & viewfull = 1 # post1024289 – HDave

+0

Este es el que funcionó para mí ... Tuve que acabar con el "Modelo", y en su lugar configurarlo hardcore .. – PedroMorgan

17

También entré en ese problema. Tengo un servicio que es responsable de buscar metadatos del servidor y adaptar los modelos y las tiendas a estos metadatos.

Por lo tanto, definí un modelo vacío y configuré la tienda para usar este modelo.

Cuando se procesan los metadatos, agrego los campos nuevos/adicionales al prototipo del modelo como este (metaDataStore es la tienda que contiene los metadatos, modelo es el modelo que se puede obtener del administrador de modelos):

var fields = []; 
metaDataStore.each(function(item) { 
    fields.push(Ext.create('Ext.data.Field', { 
     name: item.get('field') 
    })); 
}); 
model.prototype.fields.removeAll(); 
model.prototype.fields.addAll(fields); 

Cuando llamo carga en una tienda utilizando este modelo o crea nuevas instancias de modelo, los nuevos campos se procesan correctamente.