Angular 2 - 在Service中定义的变量,不在视图中更新

时间:2017-04-15 14:40:31

标签: angular

美好的一天, 我有这个疯狂的想法使用服务作为缓存存储。所以我在Service中定义了一些变量。数据在服务中更新,但更改未在视图中反映。 View已经填充,服务层随后运行。我不确定,即使将数据存储在服务中也是个好主意?有人可以说清楚它。 这是我的服务代码:

categories :  SelectItem[]=[];

constructor(private utilityService:UtilityService) {

}

//populate all drop downs array with initial data from db
 populateAll() {
//get categories
this.getCategories();
//there are lot more calls here
}
private getCategories() {
 if(this.categories.length==0){
   this.utilityService.getAllCategories().subscribe(cat=>{
   this.categories = 
   this.utilityService.getSelectItemPublished(cat,"Category");
  })
  }
 }

这就是我在组件中调用它的方式

constructor(
          private cache:CacheStoreService,

         ) { }

ngAfterViewInit()
{
this.categories=this.cache.categories;
this.depts=this.cache.depts;
this.focuses=this.cache.depts;
this.statuses=this.cache.statuses;
this.phases=this.cache.statuses;
this.visibilities=this.cache.visibilities;

}
ngOnInit() {
   this.cache.populateAll();

感谢您的帮助。还有一个问题:当在db-update缓存中添加新数据时,如何更新服务变量。 **我知道,我可以返回observable并在组件中订阅它。我正在寻找另一种方式。不确定,如果能做到的话? **

谢谢

1 个答案:

答案 0 :(得分:4)

以下是发生的事情:

  1. 服务已初始化,其类别为空数组
  2. 通过调用this.cache.populateAll()
  3. 告诉服务获取数据
  4. 服务方法发送异步请求
  5. 该组件在其自己的类别中存储对服务类别数组的引用。数组仍然是空的
  6. 很久以后,对异步请求的响应又回来了。调用回调。它不会填充服务和组件引用的数组。相反,它会为服务的类别字段分配一个新数组。该组件仍引用旧的空数组。
  7. 有几种方法可以解决这个问题。

    第一种方法是避免用另一个替换数组,而是填充原始数组。

    第二种方法是始终从服务请求数组,而不是在组件中存储第二个引用:

    get categories() {
      return this.cache.categories;
    }
    

    第三种方法是从服务中的一个observable发出一个事件,该组件将订阅以获得新的类别。