【问题标题】:How to subscript to a filtered observable如何下标过滤后的 observable
【发布时间】:2021-10-07 19:43:26
【问题描述】:

我想下标具有过滤值的可观察对象,但过滤部分不起作用。

在我的服务中,我有

export class UserService {

  private userList: user[];
  public userList$ = new BehaviorSubject<user[]>([]);

  constructor() {
    this.userList = [
      {
        name : "ben",
        isActive : true,
      },
      {
        name : "chen",
        isActive : true,
      },
      {
        name : "Ray",
        isActive : true,
      },
      {
        name : "GuanJiaHong",
        isActive : true,
      },
      {
        name : "Maoge",
        isActive : true,
      },
    ]; 

    this.userList$.next(this.userList);
  }

  getActiveUsers(): Observable<user[]> {
    return this.userList$.asObservable().pipe(map(user => user.filter(x => x.isActive == true)));
  }

  setToInactive(user: user) {
    const currentUser = this.userList.find(x => x == user);
    if(currentUser != undefined) {
      currentUser.isActive = false;
    }
  }
}

在我的组件中,我有

export class ActiveUsersComponent implements OnInit {

  activeUser$: Observable<user[]> = new Observable();

  constructor(private userService: UserService) { }

  ngOnInit(): void {
    this.activeUser$ = this.userService.getActiveUsers();
  }

  setInactive(user: user) {
    this.userService.setToInactive(user);
  }

}

在我的 activeUser 模板中,我有

Active User:<br>
<div *ngFor="let user of activeUser$ | async">
    {{user.name}} <button (click)="setInactive(user)">inactive</button><br>
</div>

当我将用户设置为非活动时,this.activeUser$ 应该只过滤活动用户,并且模板应该只显示活动用户,但它仍然显示所有用户,包括非活动用户,我想知道我的问题是什么可观察的实施?谢谢。

【问题讨论】:

    标签: angular rxjs observable behaviorsubject


    【解决方案1】:

    您忘记在 userList$ 流中发布 userList 的新状态。

    换句话说,在您的setToInactive 方法中更改 currentUser 属性后:

    this.userList$.next(this.userList);

    【讨论】:

    • 谢谢,我很难理解 behaviorSubject 和 Observable 的工作原理,this.userList$ 不应该一直跟踪 this.userList 的最新状态,这就是使用 Observable 和 BehaviorSubject 的目的吗?
    • 不,除非您明确将新项目推送到流中,否则它不会自动跟踪更改。我认为这篇文章将帮助你理解 Observable 和 Subject stackoverflow.com/questions/47537934/… 然后这篇文章将帮助你理解 BehaviourSubject stackoverflow.com/questions/43348463/…
    • 我读完了。它仍然不能解决我为什么不更新的疑问。我正在更新同一个实例,为什么我需要将同一个实例放到this.userList$ 中?我对 next() 的理解是,它是一个指向引用的指针。
    • userList 是一个指向引用的指针。因此,如果您查看您的 behaviorSubject 的值,即使您下一步不做,您也会看到更改。但是,我不知道 subscribe/next 是如何实现的 (github.com/ReactiveX/rxjs),但看起来您明确需要将 next 推送到流中,以便订阅者获取更改。这是一个小的 stackBlitz,它显示在您的 BehaviourSubject 中,更改被拾取,因为 userList 实际上是一个引用 stackblitz.com/edit/angular-playground-okkxdw?file=app/…
    猜你喜欢
    • 2018-05-25
    • 1970-01-01
    • 2015-08-27
    • 2018-06-27
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 2019-06-27
    • 2020-09-03
    相关资源
    最近更新 更多