当前位置: 首页 > 知识库问答 >
问题:

Angular-Rxjs可观察-点击事件实现

越望
2023-03-14

我在实现一个我已经实现的函数的可观察点击事件时遇到了麻烦。到目前为止,我看到的示例是使用fromEventSubject实现的,就像这样;

import {Subject} from "rxjs/Subject";

export class Component {

    private clickStream$ = new Subject<Event>();

    @Output() observable$ = this.clickStream.asObservable();

    buttonClick(event:Event) {
        this.clickStream$.next(event);
    }
}

他们的html

<button type="button" (click)="buttonClick($event)">click me</button>

现在考虑下面的实现。

组件技术

export class MyComponent {
  result;
  public search(queryString: string) {
    this.myService.search().subscribe((res) => result = res )
  }
}

index.html

<form [formGroup]="searchForm">
    <input
      formControlName="queryString"
      placeholder="Enter keyword"
      type="text"
      (keyup.enter)="search(searchForm.value.queryString)"
     >
     <div (click)="search(searchForm.value.queryString)"></div> <!-- added an icon with css ->
</form>

服务台

export class SearchService {
constructor(private http: HttpClient) {}

  search(queryString: string) {
    if (!queryString) {
      return;
    }
    return this.http.get(`${this.BASE_URL}&q=${queryString}`);
  }

}

我的问题是如何使用我当前的search(),并且在使用我找到的方法时仍然能够订阅我的myService.search()方法。(即本文中的示例代码)我理解(我认为)流,以及可观测的概念,但这是我最不理解的。

提前感谢您的帮助。

共有1个答案

鲜于阳
2023-03-14

您的代码存在一些基本问题。

1) 有一些输入错误,即方法,例如您的服务方法(searchsearchMedPolicies?)

2) 您没有在组件中导入并初始化formGroup

3) 处理组件上的订阅的方式—无需在订阅上添加return语句。

对于订阅事件,只需使用next()将单击事件馈送给主题即可。

然后,您可以订阅clickStream$主题并发出必要的HTTP请求。

以下是我建议的更正。

<form [formGroup]="searchForm">
  <input
    formControlName="queryString"
    placeholder="Enter keyword"
    type="text"
    (keyup.enter)="onSearch()"
   >
   <div (click)="onSearch($event)"></div> 
</form>

在你的component.ts上,

import { Component, OnInit } from '@angular/core';
import { FormBuilder } from '@angular/forms';
import { Subject } from 'rxjs';
import { switchMap } from 'rxjs/operators';

// other imports 

@Component({
  // etc etc
})

export class YourComponent implements OnInit {
  clickStream$ = new Subject<Event>();

  searchForm = this.fb.group({
    queryString: '',
  })

  constructor(
    private fb: FormBuilder, 
    private myService: SearchService,
  ) { }

  ngOnInit() {
    this.clickStream$
      .pipe(
        switchMap((event) => {            
          const { queryString } = this.searchForm.value;
          // console.log(event);
          // console.log(queryString);

          return this.myService.search(queryString)
        }),
      ).subscribe(response => {
        console.log(response);
        // do the rest
      });
  }

  onSearch() {
    this.clickStream$.next(event);
  }
}

在您的service.ts上,确保方法名称也匹配。

export class SearchService {

  constructor(private http: HttpClient) {}

  search(queryString: string) {
    if (!queryString) {
      return;
    }
    return this.http.get(`${this.BASE_URL}&q=${queryString}`);
  }

}
 类似资料:
  • 我对Observables和RxJs是新手,我想对回报进行调整。如果第一个选择器返回某个值,我希望第二个选择器可以观察到。但是如果第一个选择器没有返回那个特定的值,我想返回false,而不是(false)。我已经走了这么远,但这返回了一个可观察的结果

  • 我试图将一个角度函数转换为可观察模式,因为它的当前实现与它有一些异步性。为了讨论这个问题,我们举一个简单的例子。 可以通过以下方式将其转换为使用可观察对象: 我所面临的问题(据我所知)是针对无法访问内部选择语句的情况。 如果使用常规主题,订阅函数肯定不会得到任何值,因为事件的顺序是: 函数被调用 主题已创建 值已设置 调用函数订阅,因此仅在此事件发生后获取值 如果使用了BehaviorSubjec

  • 有人能向我解释一下为什么运算符可以接受返回或的函数吗? 官方文件说: FlatMap运算符通过将您指定的函数应用于源可观察对象发出的每个项目来转换可观察对象,其中该函数返回本身发出项目的可观察对象。 为什么它也可以返回数组? 例如,它们都是有效的: 但这不起作用:

  • 因此,我有一个NgRx选择器,它返回一个带有一系列触点的可观测值。我想映射这个流,对于每个联系人数组,映射每个联系人,并向Github发出Http请求以获取他们的配置文件图像,并将其附加到联系人对象。然而,我不知道如何做到这一点,而不以一系列的可观测数据结束。 下面是我尝试过的,但这不起作用。 下面是我收到的错误消息: 如有任何建议,将不胜感激!

  • 我正在单元测试Angular 12组件。组件在初始化时从服务中获取可观察的返回(参见下面的)。它被分配给一个主题,该主题通过管道显示在html模板中(参见下面的)。 AppComponent.ts 模板订阅

  • 我正在学习RxJS,对于“听众”在哪里(在可观察的或观察者中),他们是如何订阅/取消订阅的,以及当观察者“不再对”可观察的“不感兴趣”时会发生什么,比如当你使用或。 对于第一部分——什么是订阅什么,什么是倾听者——我对这些陈述之间看似矛盾的地方感到困惑。从http://reactivex.io/rxjs/manual/overview.html我们读到观察者不是观察者的“听众” 这与addEven