2015-10-16 74 views
13

我想要開始使用角2.0,現在我想知道如何在一些外部事件更改數據後啓動更新視圖。

詳細我有一個谷歌地圖和點擊事件在地圖上的處理程序。用戶點擊地圖上後餘存儲緯度和點擊的經度在到控制器

this.lat = event.latLng.lat(); 
this.lon = event.latLng.lon(); 

上的變量在視圖我想顯示這些值

<div> this is my spot: {{lat}} and {{lon}} </div> 

在角度1 I將簡單地在調用$ scope。$ apply()時將分配包裝在控制器中。

在angluar 2.0中更新視圖的首選方法是什麼?

回答

13

大多數情況下,你不需要做任何事情來更新視圖。 zone.js將爲您做所有事情。

但是,如果由於某種原因您想手動觸發更改檢測(例如,如果您的代碼運行在角度區域之外),則可以使用LifeCycle::tick()方法來執行此操作。見this plunker

import {Component, LifeCycle, NgZone} from 'angular2/angular2' 

@Component({ 
    selector: 'my-app', 
    template: ` 
    <div> 
     Hello world!!! Time: {{ time }}. 
    </div> 
    ` 
}) 
export class App { 
    time: number = 0; 

    constructor(lc: LifeCycle, zone: NgZone) { 
    zone.runOutsideAngular(() => { 
     setInterval(() => { 
     this.time = Date.now(); 

     lc.tick(); // comment this line and "time" will stop updating 
     }, 1000); 
    }) 
    } 
    doCheck() { 
    console.log('check', Date.now()); 
    } 
} 
+0

謝謝!因爲它似乎在角度區域之外(在谷歌地圖的點擊回調中)。調用lc.tick()做了訣竅:-) –

+3

嗯,也許['NgZone:run'](https://github.com/angular/angular/blob/2.0.0-alpha.44/modules/angular2 /src/core/zone/ng_zone.ts#L212)更適合您的用例。它在角區域內執行回調,執行後它運行LifeCycle.tick()。 – alexpods

+0

我與@alexpods agrre。還有另外一個問題可以通過'NgZone:run'解決它(http://stackoverflow.com/questions/31352397/how-to-update-view-after-change-in-angular2-after-google-event-偵聽器觸發) – EuAndreh

30

嘗試導入ChangeDetectorRef從核心的角度如下

import {Component, ChangeDetectorRef} from 'angular2/core'; 

在構造

constructor(private chRef: ChangeDetectorRef){ 
    chRef.detectChanges(); //Whenever you need to force update view 
} 
+1

在新角度版本中,它是從'@ angular/core'導入{Component,ChangeDetectorRef};' – Luckylooke