【问题标题】:Angular BehaviourSubject only being triggered sometimesAngular BehaviorSubject 有时只被触发
【发布时间】:2021-04-01 13:48:31
【问题描述】:

我有一个名为数据库和服务的组件 (DatabaseService)。

然后我有一个 BehaviourSubject 具有当前数据库状态,我想在应用程序组件上获得该状态。

所以在app.component.ts 上我订阅了BehaviourSubject

我从 BehaviourSubject 获取初始值,并在数据库服务构造函数上调用 .next() 后获取值,但如果我在数据库组件上调用 .next(),我不会在应用程序组件上获取值.

我已经尝试在数据库服务中的一个方法上调用.next(),但没有成功。

Database.component.ts

@Component({
  selector: 'app-database',
  templateUrl: './database.component.html',
  styleUrls: ['./database.component.scss'],
  providers: [DatabaseService]
})


export class DatabaseComponent implements OnInit, OnDestroy {

  ...

  constructor(
      private databaseService: DatabaseService,
  ) {
  }

  ngOnInit(): void {
    ...
  }

  updateDatabaseStatus(): void {
    this.databaseService.databaseStatus.next(this.StatusId.value);
  }

  ngOnDestroy(): void {
    ...
  }
}

database.service.ts

@Injectable({
    providedIn: 'root'
  })
export class DatabaseService {

    public databaseStatus = new BehaviorSubject<DatabaseStatus>(DatabaseStatus.Open);

    constructor(private api: ApiService) {
      this.getSettingsDatabaseStatus().subscribe(data => {
        this.databaseStatus.next(data[0].statusId);
      });
    }

    public getSettingsDatabaseStatus(): Observable<Status> {
      ...
    }

    public updateCurrentDatabaseStatus(status: DatabaseStatus): void {
      this.databaseStatus.next(status);
    }
}

app.component.ts

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})

export class AppComponent implements OnInit, OnDestroy {


  public databaseStatus = 'Open';

  constructor(public router: Router,
              private _api: ApiService,
              private databaseService: DatabaseService) {
  }

  ngOnInit(): void {

    this.databaseService.databaseStatus.subscribe(status => {
      this.databaseStatus = DatabaseStatus[status];
    });
  }

  ngOnDestroy(): void {
    ...
  }
}

【问题讨论】:

    标签: angular typescript rxjs angular10


    【解决方案1】:

    问题是您创建了多个 DatabaseService 实例。

    在您的数据库服务中,代码providedIn: 'root' 表示该服务的唯一实例将在您的应用程序的根目录中创建。也就是说,您的所有组件都可以访问该实例。

    但是,您在 database.component 中添加了代码 providers: [DatabaseService],然后创建了该服务的一个新的、唯一的本地实例,只有该组件将使用该实例。

    我建议您从 database.component 中删除该代码,并仅在根级别提供服务。

    此外,您肯定只想从 数据库服务 调用 .next() 函数。

    例如,您的 database.component 代码如下所示:

    @Component({
      selector: 'app-database',
      templateUrl: './database.component.html',
      styleUrls: ['./database.component.scss']
    })
    
    
    export class DatabaseComponent implements OnInit, OnDestroy {
    
      ...
    
      constructor(private databaseService: DatabaseService) {
      }
    
      ngOnInit(): void {
        ...
      }
    
      updateDatabaseStatus(): void {
          this.databaseService.updateCurrentDatabaseStatus(this.StatusId.value);
      }
    
      ngOnDestroy(): void {
        ...
      }
    }
    

    您应该可以让 app.componentDatabaseService 代码保持原来的样子。

    【讨论】:

    • 没问题,很高兴我能帮上忙!
    猜你喜欢
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 2020-03-23
    • 1970-01-01
    相关资源
    最近更新 更多