【问题标题】:Subscribe to a subject only fired once订阅只触发一次的主题
【发布时间】:2018-08-06 04:45:27
【问题描述】:

我创建了一个服务来从 API 获取数据并使用 Subject 从我的组件中获取这些数据(在应用初始化时调用 LoadTenants):

服务:

@Injectable()
 export class TenantService{
  public tenants;
  private tenantSubject = new Subject<any>();

constructor(private http: HttpClient) {
}

LoadTenants() {
    this.http.get(TENANT_URL).subscribe((data: any) => {
        this.tenants = data;
        this.setTenants();
    });
}

setTenants() {
    this.tenantSubject.next(this.tenants);
}

getTenants(): Observable<any> {
    return this.tenantSubject.asObservable();
}

getSyncTenants() {
    return this.tenants;
}
}

组件:

public tenant;
subsciption: Subscription;

constructor(private tenantService: TenantService) { }

ngOnInit() {
        this.subsciption = this.tenantService.getTenants().subscribe((datas) => {
            this.tenant = datas;
        },
            error => console.log('Error : ', error)
        );
    }
}

ngOnDestroy() {
    this.subsciption.unsubscribe();
}

第一次加载时一切正常,但如果我导航到另一个组件并返回到这个组件,则不会触发订阅,从而导致我的模板中的数据无效。

【问题讨论】:

    标签: angular rxjs subject


    【解决方案1】:

    如果要获取最新值,请使用 BehaviorSubject

    BehaviorSubject 会直接将当前值发送给订阅者

     @Injectable()
         export class TenantService{
          public tenants;
          private tenantSubject = new BehaviorSubject<any>();
    
        constructor(private http: HttpClient) {
        }
    
        LoadTenants() {
            this.http.get(TENANT_URL).subscribe((data: any) => {
                this.tenants = data;
                this.setTenants();
            });
        }
        setTenants() {
          this.tenantSubject.next(this.tenants);
        }
    
       getTenants(): Observable<any> {
          return this.tenantSubject.asObservable();
       }
    
       getSyncTenants() {
          return this.tenants;
       }
      }
    

    【讨论】:

    • 感谢 Chellapan,它适用于 private tenantSubject = new BehaviorSubject(0) 即使我不确定为什么以及那里发生了什么。
    • 问题是主题不存储值。您在主题上使用 next ,每个订阅者都会获得发出的值。但是您只需在应用程序启动时执行此操作一次。当您导航回订阅再次触发但您的主题没有发出任何东西,所以什么都没有发生。行为主题存储最新值,每个新订阅者都会立即获得最新发出的值。
    猜你喜欢
    • 2019-09-22
    • 2020-03-15
    • 2019-09-18
    • 1970-01-01
    • 2023-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多