2017-04-17 60 views
0

這不是我不想更新視圖,我只是不明白爲什麼它會在我不期望它時更新它(因爲對象是在NG外部更新的)。Angular 2更新查看它什麼時候不應該?

好的。

我有這個簡單的代碼:

@Component({ 
    selector: 'my-app', 
    template: ` 
    <div> 
    <input type='button' value="Fill more" (click)="fillMore()"/> 
    <ul> 
     <li *ngFor="let item of Items "> 
     {{item}} 
     </li> 
    </ul> 
    </div> 
    `, 
}) 
export class App { 

    Items:Array<number> = new Array<number>(); 

    constructor(private mySignalRService:MySignalRService) 
    { 
    this.Items.push(...[1,2,3]); //initial values 
    } 

    fillMore() 
    { 
    this.mySignalRService.go(this.Items); 
    } 
} 

正如你看到的,我也注入服務:

@Injectable() 
export class MySignalRService 
{ 
    makeDummyDb:Promise<Array<number>>() 
    { 
     return new Promise((v,x)=> { 
     setTimeout(function(){v([100,200,300]);},800); 
     }) 
    } 

    go(arr : Array<number>) : number 
    { 
    this.makeDummyDb().then((newValues)=>arr.push(...newValues)) ; 
    return 5; //this method must return a number 
    } 
} 

現在 - 當我點擊按鈕(在「填寫更多「按鈕),我看到附加的項目,但是當我想起它,它不是因爲更新因爲我相信makeDummyDb:Promise是在角的區域外(我可能在這裏是錯誤的)

問:

是不是陣列更新發生角的區域?我如何模擬一個真正的外部區域,以便代碼無法工作? (用於測試)

Plnkr

+0

看看這個運行的東西zone.js之外 http://stackoverflow.com/questions/43121400/run-ngrx-effect-outside-of -angulars-zone-to-prevent-timeout-in-massractor – intekhab

回答

2

如果你的觀念是的setTimeout或承諾將「外」的區域,這不是它是如何工作的; Angular 2劫持了setTimeout和setInterval(並且據我所知,使用TypeScript時,querySelector返回的是IE元素而不是HTMLElement,它強制類型轉換訪問類似「style」的東西,儘管這不會與區域有什麼關係,只是指出在TS/Angular2中,有些東西可能會有點不同)。每當超時啓動時,都會發生更改檢測。據我所知,這就是爲什麼你的價值已經設定好了,我看到的一切都在這個區域內。你必須採取一些明確的措施來避免這種情況。

周圍工作的小例子:

ngZone.runOutsideAngular(() => 
    Observable.interval(2500).subscribe(() => { 
     // async operation 
}); 
+0

好的,我怎麼能通過簡單的方法來測試一個「外部」區域? –

+0

發佈解決方案的示例。你可以看看(有很多關於這個的文檔,但是可以將它們放在一起很棘手)https://christianliebel.com/2016/11/angular-2-protractor-timeout-heres-fix/ –

相關問題