2012-09-08 16 views
6

creo dinamicamente controller nella mia domanda come questa:Come eliminare il controller ExtJS?

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

Come posso eliminare questo controller dopo l'uso? Grazie.

risposta

12

Attualmente ExtJs non supporta la rimozione dei controller fuori dalla scatola. Per la pulizia di un controller, procedere come segue:

  • Estendere Ext.app.EventBus con un metodo uncontrol che annulla la registrazione tutti gli ascoltatori di eventi che questo controller registrata sul EventBus. Controlla la fonte di Ext.app.EventBus#control per ricavare un'implementazione. O utilizzare this one.
  • Estendere Ext.app.Application con un metodo removeController che rimuove una determinata istanza controller dalla raccolta controllers. È un Ext.util.MixedCollection, controlla la fonte per Ext.app.Application#getController. Quindi pulire tutti gli ascoltatori registrati per quel controller usando uncontrol.
  • Implementare un metodo destroy sul controller specifico e/o estendere Ext.app.Controller. Dovresti almeno chiamare clearManagedListeners() e possibilmente distruggere altri oggetti creati da questo controller come viste o archivi, se questo è adatto all'architettura dell'applicazione e al ciclo di vita del controller.
+0

Buona risposta, hai approfondito l'argomento :) –

+0

Buona risposta! Dovrebbe essere posizionato per la richiesta di funzionalità a sencha – sra

+0

Buona risposta, hai coperto tutto ciò che deve essere cancellato :) Come si verifica se il controller è veramente cancellato? – bhovhannes

0

È possibile distruggere qualsiasi classe Ext con obj.destroy(). Ricordarsi di rimuovere anche tutti i riferimenti all'oggetto in modo che possano essere raccolti in modo garbage.

2

Una richiesta membro Premium è stata avviata nei forum Sencha. Sfortunatamente, la richiesta originale è stata lì da agosto senza alcuna parola. Ho appena battuto quella richiesta con riferimento a questo thread.

metodo

The Sencha Forum Topic (Premium section)

0

getController() crea un nuovo oggetto controller e memorizza riferimento ad esso in controllers matrice.

Ciò significa che se il controller viene caricato utilizzando getController(), non verrà eliminato, poiché nella proprietà controllers dell'oggetto Applicazione verrà sempre memorizzato almeno un riferimento.

Per caricare controllore in modo tale che sarà distrutto (liberare la memoria che occupa) appena perderà alcun riferimento a oggetti esistenti (elementi DOM, componenti Ext, le sue viste, ecc) si dovrebbe usare Ext.create invece di getController().
ecco il codice:

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 sarà variabile locale e sarà uscire dal campo di applicazione. L'unica cosa che continuerà a legare il controllore appena creato alla "vita reale" saranno gli elementi che il controllore crea da sé.
Ad esempio, il controller può creare una nuova vista nel suo metodo onLaunch(), che verrà iniettato in DOM, e il controller ascolterà per visualizzare gli eventi utilizzando i gestori che eseguono il binding nel suo metodo init(). Finché esisterà la visualizzazione, anche il controllore esisterà. Ma quando l'utente chiude la vista, la vista sarà distrutta e poiché è stato l'ultimo riferimento al nostro controller, anche il controller verrà distrutto.

UPDATE
ascoltatori creati con regolatore vengono aggiunti alla Ext.app.EventBus e possono impedire la rimozione automatica del regolatore, perché anche loro possono tenere riferimenti a tale controllo.

Problemi correlati