2011-11-16 11 views
6

He heredado una base de código Javascript/ExtJS3 bastante grande, y hay muchas instancias de invocación de eventos dentro del método initComponent reemplazado, después de la llamada a "... superclass.initComponent.apply (this, arguments)". eventos específicos se invocan en objetos específicos de una manera tal como la siguiente:¿Publicar/suscribirse a eventos después de la UI representa una mejor práctica independientemente del marco?

this.filter.on('filterUpdated', function(filter, params) 

He empezado a convertir el código para utilizar un pub/sub paradigma lugar, para reducir el acoplamiento entre los objetos y sus nombres de eventos específicos , pero rápidamente se encontró con problemas al publicar y/o suscribirse a eventos dentro de initComponent (que en ExtJS se ejecuta antes de la representación). Necesito disparar un evento "INIT" desde el componente de más alto nivel cuando la pantalla se carga por primera vez, y estaba obteniendo un error (debido a que las "plantillas" de ExtJS no se han renderizado como resultado), o eventos que no se activan en absoluto .

Entonces lea la siguiente en la fuente ExtJS para Ext.Component (de la que se extienden todos los componentes) y que tenía un "AHA" momento:

if (this.tpl) { 
     if (!this.tpl.compile) { 
      this.tpl = new Ext.XTemplate(this.tpl); 
     } 
     if (this.data) { 
      this.tpl[this.tplWriteMode](contentTarget, this.data); 
      delete this.data; 
     } 
    } 
    this.afterRender(this.container); 

Cuando cambiaron a tanto la publicación de la "INIT" evento desde el método afterRender de mi componente superior, y suscribiéndome a todos los eventos de todos los demás componentes desde sus métodos afterRender, todo funcionó como esperaba. Y ahora me pregunto, en gran medida para validar mi diseño ...

¿Es esta una forma generalmente aceptada de implementar pub/sub en una interfaz de usuario impulsada por eventos? Independientemente de marco, incluso? A saber, son los siguientes 2 buenos principios, o son sus otras formas?

  1. "eventos de inicialización" deben ser publicados después de todos los sub-componentes han rendido
  2. Todos los subcomponentes deben suscribirse a todos eventos (para estar en el lado seguro) después de que hayan prestado

Gracias de antemano

Respuesta

0

Tiene que equilibrar la sobrecarga del manejo de eventos frente a la posibilidad de perder eventos importantes. En js/DOM, el estado de la tierra es mutable.

Para su número 1, si puede identificar un punto en el tiempo cuando todos sus subcomponentes se han renderizado y suscrito, activar un evento init tiene sentido.

Para el n. ° 2, parece seguro para todos escuchar los eventos; sin embargo, podría ralentizar las cosas. Si los problemas de rendimiento son aparentes, es posible que tenga que decidir qué eventos no le importan y evitar suscribirse.

Cuestiones relacionadas