2012-05-13 15 views
6

W metodzie podklasy Ember.View, chciałbym wprowadzić zmiany w DOM tylko wtedy, gdy element widoku został już wstawiony do DOM. Jak mogę to sprawdzić?Ember.js: Sprawdź, czy element widoku jest wstawiony do DOM

wiem mogę utworzyć właściwość pomocniczą tak:

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

Ale jest jakiś kanoniczny, wbudowany sposób?

Nie znalazłem nic szumiącego view.js, ale być może czegoś brakuje.

Odpowiedz

9

Jeśli chcesz uniknąć konieczności ustawić flagę pomocniczą, można wydłużyć Ember.View:

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

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

Teraz każdy widok, który rozciąga Ember.View dostanie powyżej.

Również członek zespołu podstawowego sugerował, że unikasz odwoływania się do inDOM, ponieważ jest to zmienna wewnętrzna i nie jest przeznaczona do użycia w kodzie.

+0

Dzięki! Wadą wydaje się być to, że teraz musisz wywołać 'this._super()', gdy zadeklarujesz swój własny didInsertElement w podklasach Ember.View. –

+0

To jest dokładnie to, czego potrzebowałem dzięki za zwięzłą odpowiedź. – Nomad101

+0

Jak uzyskać do niego dostęp z poziomu kontrolera? Powiedzmy, że mam jakiś kod w kontrolerze, który chcę uruchomić tylko po wstawieniu widoku, ale nie chcę tego kodu wewnątrz didInsertElement. Chciałbym sprawdzić tę flagę i umieścić .observes() na metodzie do czego? Dzięki! – bfcoder

13

Każdy widok ma właściwość _state, która jest ustawiona na "inDOM" po wstawieniu elementu.

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

powinien działać. Upewnij się, że masz poprawną this!

+0

Zatwierdziłem odpowiedź Zacka jako zaakceptowaną, ponieważ uważam, że jest bardziej "poprawna", ale robię to w mojej własnej aplikacji, ponieważ jest to łatwiejsze. Umieszczam ją w nieruchomości, aby można ją było łatwo zmienić: https://gist.github.com/246bbf7305e09ed7ce80 –

+0

Właściwość 'state' została przemianowana na' _state' w Ember 1.6, a stary formularz został oznaczony jako wycofany w 1.8. – Gil

+0

@ Dziękuję. Będę edytować odpowiedź. – weltraumpirat

Powiązane problemy