类型'typeof Observable'Angular 6上不存在fromEvent属性

Val*_*Rob 25 observable rxjs angular

我在尝试创建将keyup事件转换为可观察流时遇到问题.

我正在关注Ng-book版本6.我陷入了一个在您输入时搜索YouTube视频的示例.当搜索返回时,我们将显示视频缩略图结果列表,以及每个视频的说明和链接.

所以为此,我们使用了一个observable.fromEvent:https://github.com/NiLinli/ng-book2-angular-6-r68-code-samples/blob/master/http/src/app/you-tube-search /search-box.component.ts

在RxJS 5中,它提供了一种使用Rx.Observable.fromEvent侦听元素上的事件的方法.

ngOnInit(): void {
// convert the `keyup` event into an observable stream
Observable.fromEvent(this.el.nativeElement, 'keyup')
Run Code Online (Sandbox Code Playgroud)

但是我收到了这个错误:

src/app/search-box/search-box.component.ts(42,13)中的错误:错误TS2339:类型'typeof Observable'上不存在属性'fromEvent'.

我RxJS 6 Observable和fromEvent的导入是这样的:

import { Observable, fromEvent } from 'rxjs';
Run Code Online (Sandbox Code Playgroud)

这是我在Angular 6中的RxJs5版本的代码:(它不起作用)

Observable.fromEvent(this.el.nativeElement, 'keyup')
.map((e: any) => e.target.value) // extract the value of the input 
.filter((text: string) => text.length > 1) // filter out if empty 
.debounceTime(250) // only once every 250ms 
.do(() => this.loading.emit(true)) // enable loading
      // search, discarding old events if new input comes in
.map((query: string) => this.youtube.search(query)) 
.switch()
Run Code Online (Sandbox Code Playgroud)

这是我尝试使用RxJs 6和angular 6(根据最后一个答案更新)

我试图使用管道语法:

    const obs = fromEvent(this.el.nativeElement, 'keyup')
        .pipe (
            .map((e:any) => e.target.value) // extract the value of the input

            // .filter((text:string) => text.length > 1) //filter out if empty

            .debounceTime(250) //only search after 250 ms

            .tap(() => this.loading.emit(true)) // Enable loading
            // search, call the search service

            .map((query:string) => this.youtube.search(query)) 
            // discard old events if new input comes in

            .switchAll()
            // act on the return of the search
            )   
Run Code Online (Sandbox Code Playgroud)

但我有这个错误:

类型Observable {<>}上不存在属性'map'

在命令行中,运行后服务:

搜索框/ search-box.component.ts(40,4)中的错误:错误TS1135:预期的参数>表达式.search-box/search-box.component.ts(54,4):错误TS1128:声明或>语句预期.

但是,它不起作用...... 那么,我应该怎么写我的管道sintax?

我的研究如何进行:

  1. Ng-book的文档已经过时.
  2. 角度指南的文档是不同的.
  3. 在GitHub上打开一个问题,但是他们把我送回了这里

Geo*_*ute 30

这适用于您的情况:

import { fromEvent } from 'rxjs';
import { map, filter, debounceTime, tap, switchAll } from 'rxjs/operators';

  const obs = fromEvent(this.el.nativeElement, 'keyup')
    .pipe (
        map((e:any) => e.target.value), // extract the value of the input

        // filter((text:string) => text.length > 1), //filter out if empty

        debounceTime(250), //only search after 250 ms

        tap(() => this.loading.emit(true)), // Enable loading
        // search, call the search service

        map((query:string) => this.youtube.search(query)) ,
        // discard old events if new input comes in

        switchAll()
        // act on the return of the search
        ) 
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你 !

编辑 这是Stackblitz的演示版:Demo Angular 6 + Rxjs 6

  • @ValRob我刚刚在我的回答中添加了一个演示.检查出来,它的工作正常! (2认同)

Mat*_*mer 10

在RxJS 5中,你在写作

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/map';
Run Code Online (Sandbox Code Playgroud)

RxJS 6的进口变化

import { Observable, of, Subject, Subscription } from 'rxjs';
import { map, filter, debounceTime, distinctUntilChanged } from 'rxjs/operators';
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请查看RxJS迁移指南.

  • @ValRob `import { fromEvent } from 'rxjs';` 然后`const obs = fromEvent(this.el.nativeElement, 'keyup');` (2认同)