使用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 |异步
      。如果这不起作用,可能只需在组件类中添加一个属性,并在订阅时更新它