我遇到了一个变化检测问题,我无法真正解决这个问题:
我可以在地图上显示多个位置(angular2-google-maps),这是有效的。显示的位置来自Observable(与当前选定位置组合的位置):
const locations$ = LocationService.locations;
const selectedLocations$ = new BehaviorSubject<Location[]>([]);
this.displayLocations$ = Observable.combineLatest(
locations$,
selectedLocations$,
(locations, selected) => locations.map(loc => {
if (selected.indexOf(loc) !== -1) {
return Object.assign({}, loc, {selected: true});
} else {
return loc;
}
})
)
当我通过调用
发出一组选定的位置时selectedLocations$.next([setOfLocations]);
视图更新得很好(既不是预先更新也不是地图更新)
this.displayLocations$.subscribe(l => this.displayLocations = l);
<pre>{{displayLocations | json}}</pre>
但这里不是:(预先更新和地图更新)
<pre>{{displayLocations$ | async | json}}</pre>
到目前为止,我认为,两者都是等同的变化检测方式。
到目前为止我可以这么说:
添加.do(console.log)
表示生成的集合发出正常。
这与地图模块无关。
所有事件都来自角度区域,所以(对我而言)这似乎不会导致问题。
发出的数组是不同的实例,添加distinctUntilChanged()
不会丢弃它们。此外,添加.map(arr => [...arr])
并未改变任何内容。
添加.do(() => _cdr.markForCheck())
对此没有任何影响。
有关{{array}}
(在控制器中订阅)和{{array$ | async}}
表现不同的原因和时间的任何提示都将非常感激,我真的被困在这里。