2012-09-08 10 views
6

que crear dinámicamente controladores en mi aplicación como esta:Cómo eliminar el controlador ExtJS?

var loadedController = me.app.getController(controller_name); 
      loadedController.init(); 

¿Cómo puedo eliminar este controlador después de usar? Gracias.

Respuesta

12

ExtJs actualmente no es compatible con la eliminación de los controladores de la caja. Para la limpieza de un controlador, haga lo siguiente:

  • Extender Ext.app.EventBus con un método de uncontrol que anula el registro de todos los detectores de eventos que este controlador registrados en la EventBus. Consulte la fuente de Ext.app.EventBus#control para derivar una implementación. O use this one.
  • Extienda Ext.app.Application con un método removeController que elimina una instancia de controlador determinada de la colección controllers. Es un Ext.util.MixedCollection, mira la fuente para Ext.app.Application#getController. Luego, limpie todos los oyentes registrados para ese controlador usando uncontrol.
  • Implemente un método destroy en su controlador específico y/o extienda Ext.app.Controller. Debería al menos llamar al clearManagedListeners() y posiblemente destruir otros objetos creados por este controlador como vistas o tiendas, si eso se adecua a la arquitectura de su aplicación y al ciclo de vida del controlador.
+0

Buena respuesta, profundizó en el tema :) –

+0

¡Buena respuesta! Eso debe hacerse para solicitar una función en sencha – sra

+0

. Buena respuesta, usted cubrió todo lo que tiene que ser eliminado :) ¿Cómo se prueba si el controlador realmente se borró? – bhovhannes

0

Puede destruir cualquier clase Ext con obj.destroy(). Recuerde también eliminar todas las referencias al objeto para que pueda ser recogido.

2

Se ha iniciado una solicitud de Miembro Premium en los foros de Sencha. Desafortunadamente, la solicitud original ha estado allí desde agosto sin una palabra. Acabo de superar esa solicitud con referencia a este hilo.

método

The Sencha Forum Topic (Premium section)

0

getController() crea un nuevo objeto de controlador y hacer referencia a las tiendas a ella en controllers matriz.

Eso significa que, si el controlador se carga usando getController(), no se eliminará, porque siempre habrá al menos una referencia almacenada en controllers propiedad del objeto Aplicación.

Para cargar el controlador de forma que se destruirá (libere la memoria que ocupa) tan pronto como pierda cualquier referencia a objetos existentes (elementos DOM, componentes Ext, sus vistas, etc.) uno debería usar Ext.create de getController().
Aquí está el código:

var loadedController = Ext.create(
    me.app.getModuleClassName(controller_name, 'controller'), 
    { 
     application: me.app, 
     id: Ext.id(null, 'controller') 
    } 
); 
loadedController.init(me.app); 
loadedController.onLaunch(me.app); 

loadedController será variable local y va a salir de su alcance. Lo único que continuará uniendo el controlador recién creado a la "vida real" serán los elementos que el controlador crea a sí mismo.
Por ejemplo, el controlador puede crear una nueva vista en su método onLaunch(), que se inyectará en DOM, y el controlador escuchará ver los eventos usando los manejadores enlazan en su método init(). Mientras exista vista, el controlador también existirá. Pero cuando el usuario cierra la vista, la vista se destruirá y, dado que fue la última referencia a nuestro controlador, el controlador también se destruirá.

ACTUALIZACIÓN
oyentes creados con controlador se anexan a Ext.app.EventBus y pueden evitar la extracción automática de controlador, ya que también pueden mantener las referencias a dicho controlador.

Cuestiones relacionadas