2015-10-16 75 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