【问题标题】:How can a pass the values emitted by a ReplaySubject to a array in Observable<string[]>?如何将 ReplaySubject 发出的值传递给 Observable<string[]> 中的数组?
【发布时间】:2020-10-25 18:50:17
【问题描述】:

大家。 我正在开发 Angular 应用程序并使用 ReplaySubject 进行查询词搜索。我想使用可观察的异步方法。 我的服务:

export class StateService {

  private busca$Subject: ReplaySubject<string>;
  public busca$: Observable<string>; 

  constructor() { }

  public subjectNewValue(value: string){
    this.busca$Subject.next(value);
  }

  public getBuscaObservable(): Observable<string> {
    return this.busca$;
  }

}

我的表单组件:

export class FormularioBuscaComponent implements OnInit {

  public formulario: FormGroup;

  constructor(
    private formBuilder: FormBuilder,
    private stateService: StateService) { }

  ngOnInit(): void {
    this.formulario = this.formBuilder.group({
      nome:['', Validators.required]
    });
  }

  public submit(): void {
    if(this.formulario.valid){
     this.sendData(this.formulario.get('nome').value); 
    }
  }

  public sendData(query: string): void {
    query = query.trim().replace(' ', '+');
    this.stateService.subjectNewValue(query);
  }

}

在组件上,我想显示 ReplaySubject 的所有值,我正在尝试使用 RxJS 的 toArray() 运算符,但它不起作用:

export class HistoricoBuscaComponent implements OnInit {

  public historico$: Observable<string[]>;
  constructor(private stateService: StateService, private router: Router) { }

  ngOnInit(): void {
    this.historico$ = this.getBuscaObservable().pipe(toArray());
  }
}

并在模板上订阅 observable historico$

<ul class="list-group">
    <li *ngFor="let item of historico$ | async" class="list-group-item list-group-item-action">
        {{ item }}
    </li>
</ul>

如何解决我的问题? 谢谢!

【问题讨论】:

    标签: javascript angular typescript rxjs


    【解决方案1】:

    在您的 StateService 中,您应该绑定 busca$ 和 busca$Subject:

    我的意思是:

    export class StateService {
    
      private busca$Subject: ReplaySubject<string> = new ReplaySubject(3); // you can change 3
      private busca$: Observable<string> = busca$Subject.asObservable(); // change this line
    
      constructor() { }
    
      public subjectNewValue(value: string){
        this.busca$Subject.next(value);
      }
    
      public getBuscaObservable(): Observable<string> {
        return this.busca$;
      }
    
    }
    

    【讨论】:

    • 这项工作,但是当我尝试组件时: this.historico$ = this.stateService.getBuscaObservable().pipe(toArray());我使用 tap() 进行调试,值被传递但不添加到数组中。
    • toArray 操作符只有在它的源 observable 完成后才会发出它的缓冲区。考虑将您的主题调用 complete() 为:busca$Subject.complete()。在 complete() 调用之后,toArray 将发出它的缓冲区。
    • 如果您的目的只是捕获发出的值,您可以删除 .pipe(toArray())。将 getBuscaObservable() 直接赋值给 this.historico$。
    • 谢谢@okan 完成主题我可以解决数组的问题。现在我有另一个问题,但也许这是另一个问题的主题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 2021-06-04
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    相关资源
    最近更新 更多