Это свойство fromEvent не существует для типа typeof Observable Angular 6 - PullRequest
0 голосов
/ 28 мая 2018

У меня возникла проблема при попытке создать события 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')

Но я получаю эту ошибку:

ОШИБКА в src / app / search-box / search-box.component.ts (42,13): ошибка TS2339: Свойство 'fromEvent' не существует в типе 'typeof Observable'.

I RxJS 6 импорт для Observable и fromEvent выглядит следующим образом:

import { Observable, fromEvent } from 'rxjs';

Это мой коддля версии RxJs5 в Angular 6: (она не работает)

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()

Это моя попытка с 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
            )   

Но у меня есть эта ошибка:

Свойство 'map' не существует для типа Observable {<>}

А в командной строке после запуска ng serve:

ОШИБКА в search-box / search-box.component.ts (40,4): ошибка TS1135:Аргумент> выражение ожидается.search-box / search-box.component.ts (54,4): ошибка TS1128: объявление или> оператор ожидаются.

Но это не работает ... Итак, какя должен написать свой синтаксис трубы?

Как идут мои исследования:

  1. Документация из Ng-книги устарела.
  2. Документация из угловой направляющей отличается.
  3. Я открываю проблему на GitHub, , но они отправляют меня сюда

Ответы [ 2 ]

0 голосов
/ 17 июня 2018

Это должно работать в вашем случае:

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
        ) 

Надеюсь, это поможет!

РЕДАКТИРОВАТЬ Вот рабочая демонстрация по Stackblitz: Demo Angular 6+ Rxjs 6

0 голосов
/ 29 мая 2018

В RxJS 5 вы писали

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/map';

Изменен импорт для RxJS 6

import { Observable, of, Subject, Subscription } from 'rxjs';
import { map, filter, debounceTime, distinctUntilChanged } from 'rxjs/operators';

Для получения дополнительной информации см. Руководство по миграции RxJS .

...