角度 2.0 相当于 $scope.$apply

Posted

技术标签:

【中文标题】角度 2.0 相当于 $scope.$apply【英文标题】:angular 2.0 equivalent to $scope.$apply 【发布时间】:2016-01-15 10:09:12 【问题描述】:

我正在尝试开始使用 Angular 2.0,现在我想知道如何在某些外部事件更改数据后启动对视图的更新。

详细来说,我有一个谷歌地图和一个用于地图上点击事件的处理程序。用户点击地图后,我将点击的纬度和经度存储到控制器上的变量中

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

在视图中我想显示这些值

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

在 Angular 1 中,我只需将分配在控制器中包装在对 $scope.$apply() 的调用中。

在 Angular 2.0 中更新视图的首选方法是什么?

【问题讨论】:

【参考方案1】:
setTimeout(function()
//whatever u want here
,0)

参考:http://blog.mgechev.com/2015/04/06/angular2-first-impressions/

【讨论】:

这行得通。有用的事实是你甚至不需要最后的 ,0 。您可以完全跳过该参数。【参考方案2】:

大多数情况下,您无需执行任何操作即可更新视图。 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());
  

【讨论】:

谢谢!看起来我在角度区域之外(在谷歌地图的点击回调内)。调用 lc.tick() 就可以了:-) 嗯,也许NgZone:run 更适合您的用例。它在角度区域内执行回调,执行后运行 LifeCycle.tick()。 我同意@alexpods。还有另一个问题可以这样解决,NgZone:run (***.com/questions/31352397/…) 另一种方法是像这样使用ChangeDetectorRefthis.chRef.detectChanges() LifeCycle 不再存在:/【参考方案3】:

尝试从角核心导入 ChangeDetectorRef 如下

import Component, ChangeDetectorRef from '@angular/core';

在构造函数中

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

【讨论】:

在新的 Angular 版本中是 import Component, ChangeDetectorRef from '@angular/core';

以上是关于角度 2.0 相当于 $scope.$apply的主要内容,如果未能解决你的问题,请参考以下文章

angularjs 做不到实时脏值查询

从控制台触发角度变化检测

angularjs $scope.$apply 方法详解

如何在 AngularJS 中使用 $scope.$watch 和 $scope.$apply?

Angular $scope.$apply 异步进程

$scope.$apply()