使用Angular2中更新的嵌套值调用ViewChild方法
我正在使用库在我的应用程序中显示一些圆形进度条。我有一个库存项目列表和一个更新库存列表的服务。每个库存项目组件从库存列表中的一个键获取更新的库存值,如下所示:使用Angular2中更新的嵌套值调用ViewChild方法,angular,typescript,Angular,Typescript,我正在使用库在我的应用程序中显示一些圆形进度条。我有一个库存项目列表和一个更新库存列表的服务。每个库存项目组件从库存列表中的一个键获取更新的库存值,如下所示: export class InventoryComponent implements OnInit { @ViewChild(CircleProgressComponent): circleComp: CircleProgressComponent; @Input() deviceKey: string; private ci
export class InventoryComponent implements OnInit {
@ViewChild(CircleProgressComponent): circleComp: CircleProgressComponent;
@Input() deviceKey: string;
private circleOptions: ShapeOptions { /* from angular2-progressbar example */ }
constructor(private inventoryService: InventoryService) { }
ngOnInit(): void {
this.deviceList = this.inventoryService.deviceList;
setInterval(() => {
// this value will be 0 or 1
this.circleComp.animate(this.deviceList[this.deviceKey]);
}, 2000);
}
}
虽然这确实有效,但在我看来,当inventoryService
更新其设备列表时,模板中的实际值立即更新时,仅在每2秒后进行间隔检查似乎很不妥当
我尝试实现了OnChange,但存在两个问题:
change
在视图初始生命周期之前触发,即circleComp
可用之前。这会破坏一切this.deviceList
是一个对象,其属性在内部得到更新,OnChange
无论如何都不会被触发。相反,我可以使用ngDoCheck
进行额外的检查——这确实有效,但要详细得多,而且#1仍然会导致问题AfterViewInit
生命周期挂钩(覆盖ngAfterViewInit
)。此时@ViewChild
可用
我认为可能有比轮询设备列表更好的解决方案。您可以在服务中使用主题
。这就像一个观察者和可观察者,所以你可以在一端订阅它,在另一端发布。比如说
import { BehaviorSubject } from 'rxjs/BehaviorSubject'
class InventoryService {
private _inventoryList = new BahaviorSubject<any>({ initialize with data })
inventoryList$ = this._inventoryList.asObservable();
set inventoryList(list: any) {
this._inventoryList.next(list);
}
}
出版者
service.inventoryList = newList
另请参见:
AfterViewInit
生命周期挂钩(覆盖ngAfterViewInit
)。此时@ViewChild
可用
我认为可能有比轮询设备列表更好的解决方案。您可以在服务中使用主题
。这就像一个观察者和可观察者,所以你可以在一端订阅它,在另一端发布。比如说
import { BehaviorSubject } from 'rxjs/BehaviorSubject'
class InventoryService {
private _inventoryList = new BahaviorSubject<any>({ initialize with data })
inventoryList$ = this._inventoryList.asObservable();
set inventoryList(list: any) {
this._inventoryList.next(list);
}
}
出版者
service.inventoryList = newList
另请参见:
行为主体
和主体
之间有什么区别?此外,将有多个组件订阅相同的库存清单。。。这是否仍能正常工作?是的,它将按预期工作(每个订户都看到相同的值)。请参阅以获取简短(但相当简洁的解释)在ngAfterViewInit
中添加subscribe
,效果非常好。也可以在视图中订阅吗?我有一个使用inventoryService.someProperty的视图,但是如果数据是异步更新的,我更愿意使用它,如果可能的话,您可以尝试使用异步管道<代码>inventoryService.someProperty |异步
。如果这不起作用,可以在component类中添加一个属性,并在订阅时更新它,BehaviorSubject
和Subject
之间有什么区别?此外,将有多个组件订阅相同的库存清单。。。这是否仍能正常工作?是的,它将按预期工作(每个订户都看到相同的值)。请参阅以获取简短(但相当简洁的解释)在ngAfterViewInit
中添加subscribe
,效果非常好。也可以在视图中订阅吗?我有一个使用inventoryService.someProperty的视图,但是如果数据是异步更新的,我更愿意使用它,如果可能的话,您可以尝试使用异步管道<代码>inventoryService.someProperty |异步
。如果这不起作用,可能只需在组件类中添加一个属性,并在订阅时更新它