Angular ngOnInit中的服务订阅会被调用一次,并且不会在路由更改时继续填充

Angular ngOnInit中的服务订阅会被调用一次,并且不会在路由更改时继续填充,angular,observable,routerlink,ngoninit,Angular,Observable,Routerlink,Ngoninit,我只是想澄清一下。这个angular应用程序正在将数据填充到视图中,但是当我从一个组件导航到另一个组件时,Ngonit生命周期挂钩似乎没有被调用,这意味着视图上的列表仍然为空。当我点击f5(刷新)时,无论我在哪个页面上的数据都会被填充,这意味着服务工作正常。是否生命周期挂钩才是问题所在 因此,假设我在文件product.service.ts中有以下集合 export class ProductsService { private productsCollection:AngularFir

我只是想澄清一下。这个angular应用程序正在将数据填充到视图中,但是当我从一个组件导航到另一个组件时,Ngonit生命周期挂钩似乎没有被调用,这意味着视图上的列表仍然为空。当我点击f5(刷新)时,无论我在哪个页面上的数据都会被填充,这意味着服务工作正常。是否生命周期挂钩才是问题所在

因此,假设我在文件product.service.ts中有以下集合

 export class ProductsService {

  private productsCollection:AngularFirestoreCollection<Product>;
  private products:Observable<Product[]>;

  constructor(private afs:AngularFirestore) { 
    //Code was removed from here as it is beyond the scope of the problem
    //this.products is getting populated here successfully 
  }

 getProducts(){
   return this.products;
 }
}

因此,假设componentA和componentB都有此代码,那么在加载这两个组件时,应该在这两个组件上填充列表。当我输入组件的URL时,列表会被填充,但当我使用RouterLink时,数据不会被填充,就像在调用新路由时没有触发ngOnit一样。这两个视图都显示列表,但当我使用routerlink时,它们不会被填充,而不是写入地址或刷新页面。该服务在app.module.ts中作为提供商共享。谢谢你的帮助

使用行为主体而不是观察对象。行为主体是一个热可观察对象,它允许任何订阅者提取已经推送到它的现有数据。行为主体的一个不同之处在于,您使用.next方法推送数据。当初始化BehaviorSubjects时,还需要向其传递一个初始值。在本例中,我传递了null,因为我假设您的构造函数做了一些事情来获取所需的数据。代码示例如下:

 export class ProductsService {

     private productsCollection:AngularFirestoreCollection<Product>;
     private products:BehaviorSubject<Product[]> = new BehaviorSubject(null);

     constructor(private afs:AngularFirestore) { 
       //code here to set products
       this.products.next('data to set products here')
     }

     getProducts(){
        return this.products.asObservable();
     }
 }
导出类产品服务{
私人产品收藏:AngularFirestoreCollection;
私有产品:BehaviorSubject=新的BehaviorSubject(空);
构造函数(专用afs:AngularFirestore){
//此处的代码用于设置产品
this.products.next('此处设置产品的数据')
}
getProducts(){
返回此.products.asObservable();
}
}

看起来您从未在服务中设置数据,因此它将始终为空?正在设置数据,没有任何问题,我将在其中添加注释。正如我在注释中迭代的那样,所有视图都很好。
ReplaySubject(1)
是另一种选择,如果OP没有传递给
行为主体的初始值,
将探索这两种可能性,但仍不清楚为什么在页面更改期间集合不存在,我将尝试并返回并更新。可观察的不是集合,当发出值时,它将传递给任何订阅者,但是,任何新订阅服务器(正在创建的组件)都不会获得以前发出的值。如上所述,
BehaviorSubject
确实会记住以前的值并将其传递给新订户。这可以通过从一组常规数据返回一个可观察值来实现。您可以将产品存储为Product[],然后在getProducts方法中:
返回(this.products)
但是,如果您希望在任何其他位置的任何时间更新产品,这不会触发任何订阅者。BehaviorSubject可能是解决此问题的最佳方法。@谢谢您的指点,但我知道“热门”观测值。我的印象是,如果你使用管道(映射(这里做映射),share()),我认为我正在把一个常规的可观察对象变成一个“热”的可观察对象。
 export class ProductsService {

     private productsCollection:AngularFirestoreCollection<Product>;
     private products:BehaviorSubject<Product[]> = new BehaviorSubject(null);

     constructor(private afs:AngularFirestore) { 
       //code here to set products
       this.products.next('data to set products here')
     }

     getProducts(){
        return this.products.asObservable();
     }
 }