こんにちは、ルーター3.0でAngular 2 finalを使用しています。 this.router.events
から発行されるイベントをフィルタリングしたい
私がやりたいこと :
import 'rxjs/operator/filter';
//...
this.router.events
.filter((event:Event) => event instanceof NavigationEnd)
.subscribe(x => console.log(x))
event
にはinstanceOf NavigationEnd
、NavigationStart
、またはRoutesRecognized
を指定できますが、NavigationEnd
のみが必要です。しかし、エラーが発生します
Property 'filter' does not exist on type Observable<Event>
コンパイル中。
rxjs
ライブラリ全体をインポートすると、エラーが消えます。完全なrxjsライブラリをロードせずに機能させるには、何をインポートする必要がありますか?
UPDATE
RXJS 5.x
バージョンの場合:
import 'rxjs/add/operator/filter';
RXJS 6.x
の場合 バージョン :
import { filter } from 'rxjs/operators';
ルールに従う は、JavaScript開発者がインポートパスをリファクタリングできるようにRxJSチームによって設計されました。
rxjs/operators
:すべてのパイプ可能な演算子が含まれます。
import { map, filter, scan } from 'rxjs/operators';
rxjs
:作成メソッド、タイプ、スケジューラー、およびユーティリティが含まれます。
import { Observable, Subject, asapScheduler, pipe, of, from, interval, merge, fromEvent } from 'rxjs';
このシナリオにはいくつかの可能な修正があります。
パイプ可能な演算子は、rxjs/add/operator/*にある「パッチ」演算子よりも、必要な演算子だけを取り込むためのより良いアプローチになることを意図しています
import { filter } from 'rxjs/operators';
// ..
this.router.events.pipe(
filter((event:Event) => event instanceof NavigationEnd)
).subscribe(x => console.log(x))
Importステートメントをimport 'rxjs/add/operator/filter'
に変更します。これにより、Observable.prototype
が変更され、Observableクラスのすべてのインスタンスにfilter
メソッドが追加されます。
2つの結果があります。
filter()
メソッドは、ライブラリの使用中にObservable
の下に魔法のように表示されます)ステートメントimport 'rxjs/operator/filter'
は完全に有効です。オペレーターのみをインポートします。このアプローチは、Observable.prototype
を混乱させません。マイナス面では、複数のオペレーターをチェーン化することがより難しくなります。
import 'rxjs/operator/filter'; // This is valid import statement.
// It will import the operator without
// modifying Observable prototype
// ..
// Change how the operator is called
filter.call(
this.router.events,
(event:Event) => event instanceof NavigationEnd
).subscribe(x => console.log(x));
詳細: パイプ可能な演算子
Angular Update(5.xから6.x)には、rxjsの5.xから6.xへの更新も付属しています。
import { filter } from 'rxjs/operators';
それから
this.router.events.pipe(
filter((event:Event) => event instanceof NavigationEnd)
).subscribe(x => console.log(x))
それが誰かを助けることを願っています
Angular 6アップグレードでRxjs 6に更新した後
import { map, filter, scan } from 'rxjs/operators';
...
this.registrationForm.valueChanges
.pipe(
filter(() => this.registrationForm.valid),
map((registrationForm: any) => {
this.registrationVm.username = registrationForm.username;
this.registrationVm.password = registrationForm.password;
this.registrationVm.passwordConfirm = registrationForm.passwordConfirm;
})
)
.subscribe();
それを回避する最も簡単な方法は、
npm install rxjs-compat
バージョンの違いは魔法のように消えます!