2017-07-03 67 views
0

我有一個組件在「afterViewChecked」lifeCycle中計算屬性,所以我需要使用setTimeout - 用於應用更改或者我得到錯誤。 (Angular 4 Changes based on viewAngular 2 setTimeout e2e測試失敗

我剛剛發現setTimeout,不管在我的應用程序哪裏引起量角器拋出超時消息。 - 這說

失敗:超時waitig異步角度任務完成..... - 這可能是因爲當前頁面是沒有棱角的應用」,

我該怎麼辦? - 有時你只需要使用的setTimeout ...

+0

您需要一種方式來觸發一個函數,一旦DOM元素已經呈現? –

+0

嗯,在物品被渲染後,我需要計算一些dom屬性,如果他們符合條件 - 發射一個函數。在我的應用程序的另一個地方,有超時是在啓動時,但它是暫時的。如果我刪除這兩個超時,測試工作。 –

+0

好的。你的'setTimout'的意圖是在元素呈現後觸發一個函數?另一種方法是否可以,爲了避免'setTimeout'問題?檢查是否呈現的另一種方法。 –

回答

0

的檢測另一種方式DOM改變是通過MutationObserver實例化類的構造函數,你定義什麼做的改變,然後在ngAfterViewInit()觀察它時。你運行你想要的計算函數,然後你可以停止觀察,這樣的樂趣如果進一步發生變化,警告將不會繼續。

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!'); 
    } 

}