2012-05-13 7 views
6

En un método en una subclase Ember.View, me gustaría realizar cambios en el DOM solo si el elemento de vista ya se ha insertado en el DOM. ¿Cómo puedo verificar eso?Ember.js: compruebe si el elemento de vista se inserta en DOM

Sé que podría crear una propiedad auxiliar de este modo:

didInsertElement: function() { 
    this.set('elementIsInserted', true); 
} 
willDestroyElement: function() { 
    this.set('elementIsInserted', false); 
} 

pero ¿hay alguna forma canónica, incorporada?

No encontré nada descremado view.js, pero quizás me falta algo.

Respuesta

9

Si se quiere evitar tener que establecer una marca auxiliar, se puede extender Ember.View:

Ember.View.reopen({ 
    didInsertElement: function() { 
     this.set('elementIsInserted', true); 
     this._super(); 
    }, 

    willDestroyElement: function() { 
     this.set('elementIsInserted', false); 
     this._super(); 
    } 
}); 

Ahora cada vista que se extiende Ember.View obtendrá lo anterior.

También un miembro del equipo central sugirió que evite referirse a inDOM ya que es una variable interna y no está destinado a ser utilizado en el código.

+0

¡Gracias! Una desventaja parece ser que ahora debe llamar a 'this._super()' siempre que declare su propio didInsertElement en las subclases de Ember.View. –

+0

Esto es exactamente lo que necesitaba gracias por la respuesta concisa. – Nomad101

+0

Entonces, ¿cómo se accede desde dentro de su controlador? Supongamos que tengo un código en el controlador que solo quiero ejecutar una vez que se ha insertado la vista, pero no quiero ese código dentro de didInsertElement. Verificaría esta bandera y pondría un .observes() en el método ¿a qué? ¡Gracias! – bfcoder

13

Cada vista tiene una propiedad _state, que se establece en "inDOM" cuando se inserta el elemento.

if (this._state=="inDOM") doStuff(); 

debería funcionar. ¡Asegúrese de tener el this correcto!

+0

He marcado la respuesta de Zack como aceptada porque creo que es más "correcta", pero en realidad estoy haciendo esto en mi propia aplicación porque es más fácil. Lo estoy encapsulando en una propiedad para que se pueda cambiar fácilmente: https://gist.github.com/246bbf7305e09ed7ce80 –

+0

La propiedad 'state' se renombró a' _state' en Ember 1.6 y la forma anterior se marcó como obsoleta. en 1.8. – Gil

+0

@Gil gracias. Editaré la respuesta. – weltraumpirat

Cuestiones relacionadas