Ich bin neu in Angular2 und Angular im Allgemeinen und versuche, einige jQuery zu feuern, nachdem die Dom aktualisiert wird, wenn die Daten einer Komponente geändert wird. Die jQuery muss Höhen von Elementen berechnen, damit ich nicht genau die Daten verwenden kann. Leider sieht es aus wie onAllChangesDone wird nur nach Datenänderungen ausgelöst, nicht das dom.Wie Funktion nach dom Rendern in Angular2
Antwort
Die einzige Lösung, die ich mit dem Lebenszyklus gefunden habe Haken ngAfterViewChecked.
Beispiel für einen Chat, wo Sie die Nachrichtenliste nach dem Hinzufügen und Rendering eine neue Nachricht blättern haben:
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;
}
}
Verwenden Sie AfterViewChecked nicht, verwenden Sie stattdessen AfterViewInit (nur einmal nach dem ersten AfterViewChecked aufgerufen). https://angular.io/guide/lifecycle-hooks –
@NicoToub AfterViewInit wird manchmal aufgerufen, bevor das DOM erstellt wird. Ich habe mit AfterViewChecked mit manuell gehandhabten Flag gefunden, das Code nur einmal ausführen die einzige Option erlaubt. Es ist nicht elegant, aber es funktioniert. –
- 1. AngularJS: Callback nach Rendern (Arbeit mit DOM nach Rendern)
- 2. Angular2: Wie rx-dom
- 3. Run Funktion nach Element in DOM erscheinen
- 4. Funktion nach jeder Digest-Schleife vor dem DOM-Render ausführen
- 5. Angular2, ZoneJS und extern geändertes DOM
- 6. Countdown-Komponente: Wie verhindert man das Rendern in Angular2?
- 7. Mehrere react-Komponenten in ein einzelnes DOM-Element rendern.
- 8. Angular2 Redirect nach Login
- 9. Angular2 aufrufen benutzerdefinierte Funktion nach ngSwitch neue Ansicht erstellt wird
- 10. Angular2-Richtlinie: So erkennen Sie DOM-Änderungen
- 11. Wie kann ich eine Angular2-Komponente einer Zeichenfolge rendern?
- 12. Bildlauf nach dem Rendern in Rails
- 13. Angular2 + Typescript: Wie manipuliert man das DOM-Element?
- 14. Wie Angular2 RC1 über veränderte DOM wissen lassen
- 15. Angular2 Meteor Funktion nach dem Laden der Daten ausführen
- 16. Wie rendert angular2 die Anzeige nach der Änderungserkennung?
- 17. DOM-Änderungen werden in meiner Angular2-Komponente nicht ordnungsgemäß ausgeführt
- 18. d3js importiert nach angular2
- 19. Rendern Objekt-Arrays in der Funktion reagieren
- 20. Wie Methode nach dem Rendern aufrufen?
- 21. Angular2 Observable.forkJoin Nicht aufgelöste Funktion oder Methode nach der Aktualisierung
- 22. Rendern von JSON nach HTML
- 23. Aufruf einer Funktion in ngFor in angular2
- 24. DOM-Element-spezifische Funktion überschreiben oder Funktion
- 25. Wie Rendern AngularJS Datenbindung in jQuery onClick Funktion?
- 26. Aufruf einer externen Funktion in Angular2 injiziert
- 27. templateUrl mit einer Funktion in angular2
- 28. React.refs erhalten DOM-Knotenbreite nach Rendern und triggert nur wenn Breite Wert geändert hat
- 29. Wie zu rendern Rendern: JSON
- 30. (Invariant Violation: ReactMount) Wie man JQuery Plugins in react benutzt, die das DOM nach dem Rendern verändern
auf diesen [ „Angular 2 mit JQuery“] ähnliche (http://stackoverflow.com/fragen/30623825/how-to-use-jquery-mit-angular2) Problem? Probiere 'setTimeout' aus. – shmck
@shmck, das scheint nur an der Konstruktion zu funktionieren, brauche ich etwas, das es der Funktion erlaubt, jedes Mal zu laufen, wenn die Daten geändert werden und das Dom aktualisiert wird. – ComputerWolf
neue Rückrufe haben in alpha37 https://github.com/angular/angular/blob/2.0.0-alpha.37/CHANGELOG.md Kern hinzugefügt: hinzugefügt afterContentInit, afterViewInit und afterViewChecked Haken (d49bc43) , schließt # 3897 –