Angular2 Update在异步模型更新上查看

时间:2016-08-20 09:42:25

标签: angular

我有一个依赖于数据存储区的Angular2组件。 模板在该商店上有一些数据绑定,例如“{{datastore.weather.curTemp}}” 数据存储区不时通过http更新。

现在我明白这是以asnyc的方式工作 - 这是因为我的curTemp在新数据到达时不会自动更新,对吧?

我目前的解决方案是使用EventEmitter通知我的组件有关更改,但是我需要一个局部变量来绑定,如果我需要来自我的数据存储区的很多变量,我可能会变得混乱,或者我会在ChangeDetectorRef上调用detectChanges()。

我是否在正确的轨道上?或者我错过了填充asny-data的简单方法?

谢谢!

2 个答案:

答案 0 :(得分:0)

解决问题的一种方法是让weather成为Subject

datastore.service.ts

public weather: Subject<any> = new Subject(); // better make this private and expose it `asObservable` via a getter nethod

updateWeather(){
  http.get(...).subscribe(res => this.weather.next(res.json()))
}

然后,您可以在component.ts中找到对它的引用:

public weather$: Observable<any>;
constructor (dataStore: DataStore){
  this.weather$ = dataStore.weather;
}

并在您的模板中使用它:

{{(weather$ | async).curTemp}}

这样,当您的组件被销毁时,您也不需要处理订阅,因为异步管道会为您执行此操作。

答案 1 :(得分:0)

如果您的组件没有更新,可能您的异步线程在NgZone之外运行,您可能需要通过在组件的 NgZone 中进行分配来更新组件。

$dom = new DOMDocument;
$dom->loadHTMLFile('file.html');
$content = html_entity_decode($dom->saveXML());
$n = file_put_contents($file, $content) or die('file not found');  // write the contents back to the file
echo html_entity_decode($dom->saveXML());