【发布时间】:2018-11-30 19:45:34
【问题描述】:
我正在尝试将异步数据(可观察数据)从父组件传递到子组件,但似乎子组件上的更改并未更新,我不确定为什么。
我有一个(简化的)服务正在使用BehaviourSubject:
@Injectable()
export class MyService {
private _items: BehaviorSubject<any[]> = new BehaviorSubject([]);
public items: Observable<any[]> = this._items.asObservable();
list() {
this.http.get('...').subscribe(items => {
this._items.next(items);
})
}
}
(list() 函数会定期从我的应用程序的其他位置调用以更新数据。)
然后我有一个父组件:
@Component({
selector: 'parent',
templateUrl: '<child [items]="myService.items | async"></child>',
})
export class Parent {
constructor(public myService: MyService) {
}
}
和一个孩子:
@Component({
selector: 'child',
templateUrl: '<ul><li *ngFor="item of _items">{{item.name}}</li></ul>',
})
export class Parent implements OnChanges {
@Input() items;
_items = [];
constructor() {
}
ngOnChanges(changes: SimpleChanges) {
console.log('changes', changes);
this._items = changes.items;
}
}
我的理解是,使用 async 会自动订阅/取消订阅我的 Observable 并将任何新数据传递给我的子组件。当新数据进来时,我的子组件应该会检测到ngOnChanges 中的这些变化并打印出来。
- 我的控制台输出从未触发,这表明在子节点中未检测到任何更改。我已经手动订阅了父组件中的 Observable 以验证新数据 正在 进来,所以我不确定我在哪里出错了。
- 在组件级别处理异步数据是否正确?
【问题讨论】:
-
你为什么不使用主题
-
这似乎是我的设置特有的错误,因为我已经能够创建一个它应该如何工作的示例stackblitz.com/edit/…(并且没有问题)
-
所以这个问题的核心似乎与上面的代码无关(虽然它可以通过下面的一些建议进行改进,但应该是功能性的)。在我的应用程序中,我有一个 Google 地图事件,它从我的服务中触发了
list()函数,这似乎是真正的潜在问题。我想这与在 Angular 运行循环(或类似的东西)之外调用的函数有关 -
@TimmyO'Mahony 相关链接已损坏
标签: angular