【发布时间】:2016-04-20 05:03:23
【问题描述】:
我知道我不是第一个提出这个问题的人,但我在前面的问题中找不到答案。我在一个组件中有这个
<div class="col-sm-5">
<laps
[lapsData]="rawLapsData"
[selectedTps]="selectedTps"
(lapsHandler)="lapsHandler($event)">
</laps>
</div>
<map
[lapsData]="rawLapsData"
class="col-sm-7">
</map>
在控制器中rawLapsdata 不时发生变异。
在laps 中,数据以表格格式输出为HTML。每当rawLapsdata 更改时,这都会更改。
我的map 组件需要使用ngOnChanges 作为触发器来重绘谷歌地图上的标记。问题是ngOnChanges 不会在父级中的rawLapsData 更改时触发。我能做什么?
import {Component, Input, OnInit, OnChanges, SimpleChange} from 'angular2/core';
@Component({
selector: 'map',
templateUrl: './components/edMap/edMap.html',
styleUrls: ['./components/edMap/edMap.css']
})
export class MapCmp implements OnInit, OnChanges {
@Input() lapsData: any;
map: google.maps.Map;
ngOnInit() {
...
}
ngOnChanges(changes: { [propName: string]: SimpleChange }) {
console.log('ngOnChanges = ', changes['lapsData']);
if (this.map) this.drawMarkers();
}
更新: ngOnChanges 不起作用,但看起来 lapsData 正在更新。在ngOnInit 中是一个缩放变化的事件监听器,它也调用this.drawmarkers。当我改变缩放时,我确实看到了标记的变化。所以唯一的问题是我在输入数据更改时没有收到通知。
在父级中,我有这条线。 (回想一下,变化反映在圈数中,而不是map)。
this.rawLapsData = deletePoints(this.rawLapsData, this.selectedTps);
注意this.rawLapsData本身就是一个指向大型json对象中间的指针
this.rawLapsData = this.main.data.TrainingCenterDatabase.Activities[0].Activity[0].Lap;
【问题讨论】:
-
您的代码没有显示数据的更新方式或数据的类型。是分配了一个新实例还是只是修改了值的属性?
-
@GünterZöchbauer 我添加了父组件的行
-
我想在
zone.run(...)中包含这一行应该这样做。 -
你的数组(引用)没有改变,所以
ngOnChanges()不会被调用。您可以使用ngDoCheck()并实现自己的逻辑来确定数组内容是否已更改。lapsData已更新,因为它具有/是对与rawLapsData相同的数组的引用。 -
1) 在 laps 组件中,您的代码/模板循环遍历 lapsData 数组中的每个条目,并显示内容,因此显示的每条数据都有 Angular 绑定。 2) 即使 Angular 没有检测到对组件输入属性的任何更改(引用检查),它仍然(默认情况下)检查所有模板绑定。这就是圈数如何适应变化。 3) maps 组件的模板中可能没有任何绑定到它的 lapsData 输入属性,对吧?这可以解释差异。
标签: angular angular-lifecycle-hooks