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

在我看来,这似乎意味着我没有import正确处理我的问题,因为 RxJS 不包含在 Angular 2 的构建中,尽管我的应用程序的其余部分功能正常,这对我来说意味着 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';

编辑:除了我已经写过的内容之外:使用 Angular 的 AoT 编译器进行树抖动会根据您导入的内容删除未使用的代码。如果你只是从 rxjs/rx 导入一些对象或函数,编译器无法删除任何东西。始终只导入您需要的东西!

于 2016-02-12T06:30:03.940 回答
74

问题似乎是 import 语句应该是这样的:

import {Observable} from 'rxjs/Rx';

请注意,Observable是从 fromrxjs/Rx而不是 from引入的rxjs/Observable正如@EricMartinez 提到的那样,以这种方式拉动它会自动获得所有运算符(如.map())。

于 2015-12-21T14:10:17.473 回答