2017-07-03 3 views
0

Ich habe eine Komponente, die Eigenschaften in der "afterViewChecked" lifeCycle berechnen, also muss ich setTimeout verwenden - für die Änderungen gelten oder sonst bekomme ich Fehler. (Angular 4 Changes based on view)Angular 2 setTimeout e2e Tests schlägt fehl

Ich habe gerade herausgefunden, dass setTimeout, egal wo in meiner Anwendung verursacht Winkelmesser Zeitüberschreitungsnachricht zu werfen. - das sagt

fehlgeschlagen: Timed waitig für asynchrone Winkelaufgaben zu beenden ..... - dies sein kann, weil die aktuelle Seite nicht Winkel Anwendung“ist,

Was soll ich tun? - manchmal müssen Sie nur setTimeout verwenden ...

+0

Sie benötigen einen Weg, um eine Funktion zu feuern, sobald die DOM-Elemente gemacht wurden? –

+0

Nun, ja, nachdem die Elemente gerendert wurde, muss ich einige Dom Eigenschaften berechnen und wenn sie die Bedingung erfüllen - um eine Funktion auszulösen. ein anderer Ort in meiner App, dass es Timeout gibt, ist beim Start, aber es ist temporär. Wenn ich diese 2 Timeouts entferne, funktioniert der Test. –

+0

Ok. Die Absicht mit deinem 'setTimout' war es, eine Funktion auszulösen, sobald die Elemente gerendert wurden. Wäre eine andere Methode in Ordnung, um das 'setTimeout'-Problem zu vermeiden? Eine weitere Möglichkeit zu überprüfen, ob gerendert. –

Antwort

0

Eine andere Möglichkeit, DOM-Änderungen zu erkennen, ist über MutationObserver. Instantiieren Sie die Klasse im Konstruktor, wo Sie definieren, was bei einer Änderung zu tun, und beobachten Sie dann in ngAfterViewInit() Sie laufen die Berechnungsfunktion, die Sie wollen, können Sie dann aufhören zu beobachten, so dass der Spaß ction wird nicht weiter feuern, wenn weitere Änderungen auftreten.

import { Component, AfterViewInit } from '@angular/core'; 

@Component({ 
    selector: 'app-test', 
    template: `<div #element></div>` 
}) 
export class TestComponent implements AfterViewInit { 
    @ContentChild('element') element : ElementRef; 
    this.observer: MutationObserver; 

    constructor() { 
    this.observer = new MutationObserver(mutations => { 
     this.testFunction(); 
    }); 
    } 

    ngAfterViewInit() { 
    this.observer.observe(this.element.nativeElement, { attributes: true, childList: true, characterData: true }); 
    } 

    testFunction() { 
    this.observer.disconnect(); // We no longer want to observe 
    alert('Test!'); 
    } 

}