Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 只有在某些情况下才会被触发_Angular_Typescript_Rxjs_Angular10 - Fatal编程技术网

Angular 只有在某些情况下才会被触发

Angular 只有在某些情况下才会被触发,angular,typescript,rxjs,angular10,Angular,Typescript,Rxjs,Angular10,我有一个名为数据库的组件和一个服务(DatabaseService) 然后我有一个behavior subject,它具有当前数据库状态,我想在应用程序组件上获取该状态 因此,在app.component.ts上,我订阅了行为主题 我从Behavior Subject中获取初始值,在数据库服务构造函数上调用.next()后获取值,但如果在数据库组件上调用.next(),则不会在应用程序组件上获取值 我已经尝试在数据库服务中的一个方法上调用.next(),但没有成功 数据库.component.t

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

然后我有一个
behavior subject
,它具有当前数据库状态,我想在应用程序组件上获取该状态

因此,在
app.component.ts
上,我订阅了
行为主题

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

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

数据库.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 {
    ...
  }
}
@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);
    }
}
@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 {
    ...
  }
}
数据库.service.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 {
    ...
  }
}
@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);
    }
}
@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 {
    ...
  }
}

问题是您已经创建了多个数据库服务的实例

在数据库服务中,“root”中提供的代码
意味着将在应用程序的根目录下创建该服务的唯一实例。i、 e.您的所有组件都可以访问该实例

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

我建议您从数据库.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 {
    ...
  }
}

你应该可以让你的应用程序组件和数据库服务按照当时的方式编码。

谢谢你解决了这个问题。没问题,很高兴我能帮忙!