2015-07-01 13 views
28

Jestem nowy w Angular2 i Angular w ogóle i próbuję uzyskać jQuery do ognia po dom jest aktualizowany, gdy dane składnika jest zmieniony. JQuery musi obliczyć wysokości elementów, więc nie mogę dokładnie użyć danych. Niestety wygląda na to, że onAllChangesDone uruchamia się tylko po zmianie danych, a nie w domenie.Jak wywołać funkcję po renderowaniu dom w Angular2

+0

Wiąże się z tym [ „kątowa 2 z jQuery”] (http://stackoverflow.com/questions/30623825/how-to-use-jquery-with-angle2)? Wypróbuj 'setTimeout'. – shmck

+0

@shmck, który wydaje się działać tylko na budowie, potrzebuję czegoś, co pozwoli na uruchomienie funkcji za każdym razem, gdy dane zostaną zmienione, a dom zostanie zaktualizowany. – ComputerWolf

+1

nowe wywołania zwrotne, które zostały dodane w alpha37 https://github.com/angular/angular/blob/2.0.0-alpha.37/CHANGELOG.md Rdzeń: dodano afterContentInit haki afterViewInit i afterViewChecked (d49bc43) , zamyka się # 3897 –

Odpowiedz

42

Jedyne rozwiązanie, jakie udało mi się znaleźć w haku cyklu życia: ngAfterViewChecked.

Przykład czat gdzie trzeba przewinąć listę wiadomości po dodaniu i renderowania nową wiadomość:

import {Component, AfterViewChecked, ElementRef} from 'angular2/core'; 

@Component({ 
    selector: 'chat', 
    template: ` 
     <div style="max-height:200px; overflow-y:auto;" class="chat-list"> 
      <ul> 
       <li *ngFor="#message of messages;"> 
        {{ message }} 
       </li> 
      </ul> 
     </div> 
     <textarea #txt></textarea> 
     <button (click)="messages.push(txt.value); txt.value = '';">Send</button> 
    ` 
}) 

export class ChatComponent implements AfterViewChecked { 
    public messages: any[] = [];   
    private _prevChatHeight: number = 0; 

    constructor (public element: ElementRef) { 
     this.messages = ['message 3', 'message 2', 'message 1']; 

     this.elChatList = this.element.nativeElement.querySelector('.chat-list'); 
    }  

    public ngAfterViewChecked(): void { 
     /* need _canScrollDown because it triggers even if you enter text in the textarea */ 

     if (this._canScrollDown()) { 
      this.scrollDown(); 
     }  
    }  

    private _canScrollDown(): boolean { 
     /* compares prev and current scrollHeight */ 

     var can = (this._prevChatHeight !== this.elChatList.scrollHeight); 

     this._prevChatHeight = this.elChatList.scrollHeight; 

     return can; 
    } 

    public scrollDown(): void { 
     this.elChatList.scrollTop = this.elChatList.scrollHeight; 
    } 
} 
+3

Nie używaj funkcji AfterViewChecked, zamiast tego użyj funkcji AfterViewInit (wywoływanej tylko raz, po pierwszym AfterViewChecked). https://angular.io/guide/lifecycle-hooks –

+5

@NicoToub AfterViewInit czasami jest wywoływana przed skonstruowaniem DOM. Znalazłem użycie funkcji AfterViewChecked z ręcznie obsługiwaną flagą, która zezwala na uruchamianie kodu tylko raz jako jedyna opcja. To nie jest eleganckie, ale działa. –

Powiązane problemy