2012-05-13 9 views
6

In un metodo su una sottoclasse Ember.View, vorrei apportare modifiche al DOM solo se l'elemento di visualizzazione è già stato inserito nel DOM. Come posso verificarlo?Ember.js: Controlla se l'elemento di visualizzazione è inserito in DOM

So che potrei creare una proprietà ausiliario in questo modo:

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

ma c'è qualche, modo incorporato canonica?

Non ho trovato nulla sfiorando lo view.js, ma forse mi manca qualcosa.

risposta

9

Se si vuole evitare di dover impostare una bandiera ausiliario, è possibile estendere Ember.View:

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

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

Ora ogni vista che si estende Ember.View otterrà quanto sopra.

Anche un membro del team principale ha suggerito di evitare di fare riferimento a inDOM in quanto è una variabile interna e non è destinata a essere utilizzata nel codice.

+0

Grazie! Uno svantaggio sembra essere che ora devi chiamare 'this._super()' ogni volta che dichiari il tuo didInsertElement in sottoclassi di Ember.View. –

+0

Questo è esattamente ciò di cui avevo bisogno, grazie per la risposta concisa. – Nomad101

+0

Quindi, come si accede a questo da dentro il controller? Diciamo che ho un codice nel controller che voglio solo eseguito una volta che la vista è stata inserita ma non voglio che il codice all'interno diInsertElement. Vorrei controllare questo flag e mettere un .observes() sul metodo per cosa? Grazie! – bfcoder

13

Ogni vista ha una proprietà _state, che è impostata su "inDOM" quando l'elemento è inserito.

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

dovrebbe funzionare. Assicurati di avere il corretto this!

+0

Ho contrassegnato la risposta di Zack come accettata perché penso che sia più "corretta", ma in realtà la sto facendo nella mia app perché è più semplice. Lo sto incapsulando in una proprietà, quindi può essere facilmente modificato: https://gist.github.com/246bbf7305e09ed7ce80 –

+0

La proprietà 'state' è stata rinominata in' _state' in Ember 1.6 e il vecchio modulo è stato contrassegnato come deprecato in 1.8. – Gil

+0

@ Gil grazie. Modificherò la risposta. – weltraumpirat

Problemi correlati