2012-06-06 14 views
9
Ext.define('DigitalPaper.controller.Documents', { 
extend: 'Ext.app.Controller', 

views: ['Documents'], 
stores: ['Documents'], 
models: ['Documents'], 

init: function() { 
    console.log('[OK] Init Controller: Documents'); 
} 
}); 

¿Cuál es la función para obtener el modelo o la vista de este controlador? He intentadoExtjs4 MVC, ¿cómo obtener Modelo o Vista desde una clase de Controlador?

Ext.getModel('Documents'); 
    this.getModel('Documents'); 
    this.getModel(); 
    this.getDocumentsModel(); 

Cualquier sugiere?

Respuesta

9

solución encontrada:

En el controlador, es posible utilizar la referencia a la vista:

refs: [{ 
    ref: 'viewDocuments', // will be create the method this.getViewDocuments(); 
    selector: 'Documents' 
}], 

para que pueda obtener la vista con esto:

this.getViewDocuments(); 
+6

Nadie parece decir donde los "this.getViewDocuments();" Es necesario que haya - o lo que "este" se encuentra en el pueblo de contexto están esperando que lo use :( –

+0

@PaulHutchinson Mediante la utilización de la sección de la definición de controlador ExtJS los árbitros '', puede crear referencias rápidas para acceder a los componentes comúnmente Referencias automágicamente. crear métodos 'getter' basado en el texto proporcionado para 'ref'. en este ejemplo, el getter creado es 'getViewDocuments'. esto puede ser llamado en todo el controlador, donde se refiere esto a la alcance del controlador. la definición 'selector' se utiliza en la llamada resultante Ext.ComponentQuery.query(). Ver la documentación para ComponentQuery.query() y ver lo poderoso que la definición selector puede ser! –

0

getModel() y getView() no devuelven el modelo/vistas del controlador - devuelven instancias de estos en la aplicación (y si no existen, se instanciarán).

Simplemente puede usar esto para obtener los nombres vista/modelo:

this.views[0] 

No estoy seguro de dónde se está utilizando su gets (es decir, this.getModel ('Detalles')), pero estos debería devolver correctamente una instancia del modelo (el constructor es el único lugar donde podría haber problemas al respecto).

+0

esta respuesta no tiene mucho sentido. –

+0

Sí, debo haber entendido mal la pregunta.Y tienes razón, getModel devuelve la clase no una instancia; es por eso que usamos .create(); – Izhaki

1

Esto debería funcionar:

Ext.define('DigitalPaper.controller.Documents', { 
extend: 'Ext.app.Controller', 

views: ['Documents'], 
stores: ['Documents'], 
models: ['Documents'], 

init: function() { 
    console.log('[OK] Init Controller: Documents'); 

    // get references to view and model classes which can be used to create new instances 
    console.log('View', this.getDocumentsView()); 
    console.log('Model', this.getDocumentsModel()); 

    // reference the Documents store 
    console.log('Store', this.getDocumentsStore()); 

} 

});

Estos métodos se crean mediante un método en el controlador Ext que crea los getters. http://docs.sencha.com/ext-js/4-0/source/Controller.html#Ext-app-Controller

Esto es lo que parece que el método como:

createGetters: function(type, refs) { 
    type = Ext.String.capitalize(type); 
    Ext.Array.each(refs, function(ref) { 
     var fn = 'get', 
      parts = ref.split('.'); 

     // Handle namespaced class names. E.g. feed.Add becomes getFeedAddView etc. 
     Ext.Array.each(parts, function(part) { 
      fn += Ext.String.capitalize(part); 
     }); 
     fn += type; 

     if (!this[fn]) { 
      this[fn] = Ext.Function.pass(this['get' + type], [ref], this); 
     } 
     // Execute it right away 
     this[fn](ref); 
    }, 
    this); 
}, 
+0

getDocumentsView() no devuelve una instancia de un Ver documentos –

+0

Buen punto. Actualicé el fragmento de ejemplo con comentarios que notan lo que los captadores están devolviendo. Ver –

+0

función() Función Modelo() {almacén de objetos hechos = {...}, datos = {...}, meros = {...}, altri elementi ...} -> me sale esto en la consola, funciona para la tienda, pero no para Ver y Modelo. Me sale "() la función" –

7

controladores Ext son bastante raro, en que hay una sola instancia de un controlador determinado, no importa cuántas relacionados visión casos que pueda tener. En la mayoría de los sistemas MVC o MVP hay una instancia de controlador por instancia de vista.

Si va a utilizar varias instancias de vista, no debe mantener referencias a esas vistas en el controlador.

Es posible que desee ver en la extensión de MVC hábil para ExtJs que tiene un controlador por ejemplo instancia de vista (además de la inyección de dependencias):

http://deftjs.org/

De todas formas, controller.getView() devuelve una referencia a la ver CLASE, no una instancia de objeto. Lo mismo con getModel(). getStore() devuelve una instancia de tienda.

En su controlador, puede hacer algo como esto:

this.viewInstance = this.getDocumentsView().create(); 

También recomendaría el nombramiento de su modelo en singular. No es un documento. Es un documento.

Cuestiones relacionadas