如何使用systemjs在最小的Angular 2应用程序中加载RxJS?

Tob*_*oby 11 javascript rxjs typescript angular

我无法在地面使用RxJS获得最小的Angular 2应用程序.我正在使用Typescript(tsc 1.6.2)和systemjs进行模块加载.如何让systemjs正确加载Rx模块?我已经没有想法尝试,我会欣赏任何指向我做错的指针.模块加载对我来说有点神奇.很沮丧.

index.html:

<!DOCTYPE html>
<html>
<head>
    <title>Title</title>
    <script src="../node_modules/es6-shim/es6-shim.js"></script>
    <script src="../node_modules/systemjs/dist/system.src.js"></script>
    <script src="../node_modules/rx/dist/rx.lite.js"></script>
    <script src="../node_modules/angular2/bundles/angular2.dev.js"></script>
</head>

<body>
    <app>App loading...</app>
    <script>
        System.config({
            packages: { 'app': { defaultExtension: 'js' } }
        });
        System.import('app/app');
    </script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

app.ts:

/// <reference path="../../node_modules/rx/ts/rx.all.d.ts" />
import { bootstrap, Component, View } from 'angular2/angular2';
import * as Rx from 'rx';

@Component({
    selector: 'app'
})
@View({
        template: `Rx Test`
})
export class App {
    subject: Rx.Subject<any> = new Rx.Subject<any>();
}
bootstrap(App);
Run Code Online (Sandbox Code Playgroud)

SystemJS尝试加载不存在的文件:

在此输入图像描述

一旦我在上面的代码中注释掉主题,一切都运行良好,因为不会尝试加载不存在的文件(并且没有加载rx).

Eri*_*nez 9

更新angular2 beta 0

Angular2不再在Angular2本身内捆绑RxJS.现在您必须单独导入运算符.这是一个重要的突破性变化,我在这里回答.所以请参考这个答案,因为这个已经过时,不再适用.

2015年12月11日更新

Alpha46正在使用RxJS alpha 0.0.7(很快将为0.0.8).由于这NG2 alpha版本,你不需要更多下面的解决方案,现在可以进口Observable,Subject其中包括直接angular2/angular,所以原来的答案可以被丢弃

import {Observable, Subject} from 'angular2/angular2';
Run Code Online (Sandbox Code Playgroud)

=====================================

Angular2不再使用旧的RxJS,他们移动到新的RxJS 5(又名RxJS Next),因此它将与Http和EventEmitter冲突.

所以首先删除导入和脚本到rx.lite.js.

相反,你必须这样做(你的配置中不需要脚本或映射)

编辑

这条线是为了让它在plnkr中工作,但在我的项目中我只需添加其他东西

Plnkr版本

import Subject from '@reactivex/rxjs/dist/cjs/Subject';
Run Code Online (Sandbox Code Playgroud)

离线版

import * as Subject from '@reactivex/rxjs/dist/cjs/Subject';
Run Code Online (Sandbox Code Playgroud)

关于离线版本的说明

如果您在本地项目中尝试第一种plnkr方法,则可能会收到此消息错误

TypeError: Subject_1.default is not a function
Run Code Online (Sandbox Code Playgroud)

因此,对于本地(离线)版本,您应该使用第二种方法(使用星号).

注意

没有括号,Subject这在对话中有解释(我有同样的问题,哈哈)

这是一个没有失败的人.

我希望它有所帮助.如果我错过了什么,请告诉我;)


Mur*_*sli 8

对于angular2 alpha52使用rxjs 5alpha.14

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

但是你必须像这个例子一样单独导入每个操作符

import { Subject } from 'rxjs/Subject';
import { Observable } from 'rxjs/Observable';

require('rxjs/add/operator/map');
require('rxjs/add/operator/scan');
require('rxjs/add/operator/mergemap');  //for flatmap
require('rxjs/add/operator/share');
require('rxjs/add/operator/combinelatest-static'); //for combinelatest
Run Code Online (Sandbox Code Playgroud)