Je ne parviens pas à obtenir une application minimale Angular 2 utilisant RxJS sur le sol. J'utilise TypeScript (tsc 1.6.2) et systemjs pour le chargement des modules. Comment puis-je obtenir systemjs à charger le module Rx correctement? J'ai manqué d'idées pour essayer et j'apprécierais tout pointeur sur ce que je fais mal. Le chargement du module est un peu magique pour moi. Très frustrant.
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>
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);
SystemJS tente de charger un fichier qui n'existe pas:
Dès que je commente le sujet dans le code ci-dessus, tout se passe bien car il n'y aura pas de tentative de chargement du fichier inexistant (et aucun rx n'est chargé).
Angular2 ne regroupe plus RxJS dans Angular2 lui-même. Vous devez maintenant importer les opérateurs individuellement. Ce fut un changement de rupture important auquel j'ai répondu ici . Veuillez donc vous référer à cette réponse car celle-ci est obsolète et ne s'applique plus.
Mise à jour 12/11/2015
Alpha46 utilise RxJS alpha 0.0.7 (bientôt 0.0.8). Depuis cette version alpha ng2 vous n'avez plus besoin de la solution ci-dessous, vous pouvez désormais importer Observable
, Subject
entre autres directement depuis angular2/angular
, afin que la réponse d'origine puisse être ignorée
import {Observable, Subject} from 'angular2/angular2';
=====================================
Angular2 n'utilise plus l'ancien RxJS , ils sont passés au nouveau RxJS 5 (alias RxJS Next) donc il entrera en collision avec Http et EventEmitter.
Supprimez donc d'abord l'importation et le script dans rx.lite.js.
Au lieu de cela, vous devez le faire (vous n'avez pas besoin de scripts ni de mappage dans votre configuration)
Modifier
Cette ligne est de le faire fonctionner dans un plnkr, mais dans mes projets je dois juste ajouter autre chose
Version Plnkr
import Subject from '@reactivex/rxjs/dist/cjs/Subject';
Version hors ligne
import * as Subject from '@reactivex/rxjs/dist/cjs/Subject';
Remarque sur la version hors ligne
Si vous essayez la première approche pour plnkr dans vos projets locaux, vous obtiendrez probablement ce message d'erreur
TypeError: Subject_1.default is not a function
Donc, pour votre version locale (hors ligne), vous devez utiliser la deuxième approche (avec l'astérisque).
Remarque
Il n'y a pas de parenthèse dans Subject
et cela est expliqué dans cette conversation (j'ai eu le même problème, lol)
Voici un plnkr n'échoue pas .
J'espère que ça aide. Si j'ai raté quelque chose, dites-le moi;)
Pour angular2 alpha52 utilise rxjs 5alpha.14
<script>
System.config({
map: { rxjs: 'node_modules/rxjs' },
packages: {
rxjs: { defaultExtension: 'js' },
'app': {defaultExtension: 'js'}
}
});
System.import('app/app');
</script>
mais vous devez importer chaque opérateur individuellement comme cet exemple
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
Publier cette réponse après Angular 4 release. Essayez de charger le strict minimum depuis Rxjs, car Angular prod build même avec AOT va 300kb)
J'espère que cela aide.
import { Injectable } from '@angular/core';
import {Http} from "@angular/http";
import {Observable} from "rxjs/Observable";
import 'rxjs/add/operator/map';// load this in main.ts
import {AllUserData} from "../../../shared/to/all-user-data";
@Injectable()
export class ThreadsService {
constructor(private _http: Http) { }
loadAllUserData(): Observable<AllUserData> {
return this._http.get('/api/threads')
.map(res => res.json());
}
}