53

私は AngularJS 2 Beta 0 を使用しており、ウィンドウ オブジェクトのイベントから RxJS Observable を作成しようとしています。サービスでイベントを Observable としてキャプチャするための式を知っていると思います。

var observ = Observable.fromEvent(this.windowHandle, 'hashchange');

問題は、このコードを実行しようとするたびに、「fromEvent」が関数ではないというエラーが表示されることです。

Uncaught EXCEPTION: Error during evaluation of "click"
ORIGINAL EXCEPTION: TypeError: Observable_1.Observable.fromEvent is not a function

これは、RxJS が Angular 2 のビルドに含まれていないため、正しく処理していないことを暗示しているように思えimportますが、アプリケーションの残りの部分は適切に機能します。これは、RxJS が本来あるべき場所であることを意味します。

サービスへのインポートは次のようになります。

import {Observable} from 'rxjs/Observable';

代わりにこれを使用しようとしましたが(コードに適切な変更を加えて)、同じ結果になりました:

import {FromEventObservable} from 'rxjs/observable/fromEvent';

Index.html に次の構成があります。

<script>
    System.config({
        map: {
            rxjs: 'node_modules/rxjs'
        },
        packages: {
            'app': {defaultExtension: 'js'},
            'rxjs': {defaultExtension: 'js'}
        }
    });
    System.import('app/app');
</script>

誰かが私が間違っていることを教えてもらえますか?

4

2 に答える 2

103

一度にすべてのオペレーターをインポートする必要はありません! fromEvent間違ってインポートしただけです。次のようにできます。

import {Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/fromEvent';

EDIT:私がすでに書いたことに加えて:angularのAoT-Compilerを使用したツリーシェイクは、インポートしたものに基づいて未使用のコードを削除します。rxjs/rx からいくつかのオブジェクトまたは関数をインポートしただけでは、コンパイラは何も削除できません。常に必要なものだけをインポートしてください!

于 2016-02-12T06:30:03.940 に答える
74

問題は、インポートステートメントが次のようになることです。

import {Observable} from 'rxjs/Rx';

Observableが fromrxjs/Rxではなくfrom から取り込まれていることに注意してくださいrxjs/Observable@EricMartinez が言及しているように、この方法でプルすると、すべての演算子 ( など) が自動的に取得されます.map()

于 2015-12-21T14:10:17.473 に答える