Angular 2的Http服务不暴露map()和其他RxJS函数

时间:2015-12-06 03:40:15

标签: typescript angular rxjs

有人知道alpha 45和alpha 48之间的http是否有任何重大变化?我一直在寻找,我没有找到任何东西。我的问题是下面的代码在Alpha 45上完美运行。但是现在我已经升级到Alpha 48,当我尝试运行应用程序时,我收到public Authenticate(username: string, password: string): Observable<boolean> { this.ResetAuthenticationValues(); return Observable.create((subscriber: EventEmitter<string>) => { let body: string = 'grant_type=password&username=' + username + '&password=' + password; let headers = new Headers(); headers.append('Content-Type', 'application/x-www-form-urlencoded'); this.http.post('http://example.com', body, {headers: headers}) .map(res => res.json()) .subscribe( (data: DataResponse) => { if (!data.error) { this.accessToken = {access_token: data.access_token, token_type: data.token_type}; subscriber.next(this.isAuthenticated = true); } else subscriber.error(this.isAuthenticated = false); }, (err) => subscriber.error(err), () => subscriber.complete() ); return () => { }; }); } 错误消息。奇怪的是,IntelliSense显示http.post正在返回一个可观察的。这意味着地图功能应该可用。任何帮助,将不胜感激。谢谢!

{{1}}

5 个答案:

答案 0 :(得分:31)

另一次更新 (咳嗽,抱歉,忘了这个选项)

如果您想避免单独添加运算符,可以通过执行

导入完整的Rx
import {Observable, Subject, ReplaySubject, etc...} from 'rxjs/Rx';

你将拥有所有的运营商:)

更新alpha 50 (08/12/2015)

在alpha 49发布后不久,他们发布了alpha 50.这个版本将rxjs升级到了alpha 14.这样你就可以了。

npm install angular2@latest
npm install rxjs@5.0.0-alpha.14

更新alpha 49 (08/12/2015)

截至目前alpha 49已被释放,但这并没有改变,这意味着这将保持及时。原始答案仍然有效,只有一些更改,rjxs的路径已更改,因此它应如下所示:

System.config({
    paths: {
        'rxjs/add/observable/*' : 'node_modules/rxjs/add/observable/*.js',
        'rxjs/add/operator/*' : 'node_modules/rxjs/add/operator/*.js',
        'rxjs/*' : 'node_modules/rxjs/*.js'
    }
});

import 'rxjs/add/operator/map';

注意

此版本完全需要alpha 13版本,因此如果您的package.json中已有其他版本,则必须将其删除,安装angular2,然后安装rjxs。

<强>更新

CHANGELOG已更新,以显示此突破性更改。 comment from @jeffbcross中有一个issue #5642,澄清了很多事情。

引用该评论的一部分

  

模块化从一开始就是新RxJS项目的目标,直到最近我们才真正开始认真构建运营商,而不是依赖于Rx的分层分布。

原始回答

RxJS和Angular2实际上有一个突破性的变化。所以现在要使用像map这样的运算符,你必须单独导入它们。您可以在此pull request中看到更改。关于你的问题已经有issue了。

我建议你坚持使用alpha 47.但是对于每个需要并想知道解决方案是什么的人,比如指定了pull请求,要单独添加运算符。

你必须有这样的东西

import {Http, ...} ...;

// Component
constructor(http: Http) {
    http.get(...).map() // 'map' doesn't exist! Ouch!
}

要解决此问题,请添加运算符(抱歉重复多次)并配置rxjs的路径

注意

这必须使用RxJS alpha 11或alpha 12(不要将其与@reactivex/rxjs混淆,现在它只是rxjs )。所以用

安装它
npm install rxjs@5.0.0-alpha.11

或者只是npm install rxjs如果你想要最新的,尽管他们lock it是alpha 11。

配置System.config中的路径(请注意,这是我的配置,不一定是最好的,我假设你安装了alpha 11)

System.config({
    paths: {
        'rxjs/observable/*' : 'node_modules/rxjs/observable/*.js',
        'rxjs/operators/*' : 'node_modules/rxjs/operators/*.js',
        'rxjs/*' : 'node_modules/rxjs/*.js'
    }
});

完成配置后,您可以按如下方式导入运算符

 import 'rxjs/operators/map';

就是这样。每个操作员都必须这样做。所以我再说一遍,我建议你坚持使用alpha 47,就像我在评论中告诉你的那样。我将尝试稍后用plnkr更新答案。

答案 1 :(得分:14)

如果您想使用Angular 2的Beta版本或未来的实际版本,那么您需要做两件事才能使其发挥作用。

1)您首先需要更新index.html中的System.config()配置以包含对RxJS的引用:

System.config({
    map: {
        'rxjs': 'node_modules/rxjs'
    },
    packages: {
        'app': {defaultExtension: 'js'}, // assumes your code sites in `src/app`
        'rxjs': {defaultExtension: 'js'}
    }
});
System.import('app/app'); // this assumes your main file is `app.ts` and it sits in the `app` folder.

2)然后,您可以将map()和其他(或所有)RxJS运算符导入到您的应用程序中,主文件中包含import行(在我的情况下为app.ts):

import 'rxjs/Rx'; // this would import all RxJS operators

如果您只想导入map()来缩小尺寸,则可以改为:

import 'rxjs/add/operator/map';

需要将这些导入到每个类文件中。只需将它们导入主文件,即可访问所有其他组件/服务/指令。

答案 2 :(得分:5)

您需要在组件中导入Rx贴图操作符,如

import 'rxjs/add/operator/map';

干杯!

答案 3 :(得分:0)

与上面所写的相反,我发现我需要使用

    System.config({
        packages: {
            'app': {defaultExtension: 'js'},
            'node_modules': {defaultExtension: 'js'}
        },
        paths: {
            'rxjs/*' : 'node_modules/rxjs/*.js'
        }
    });

node_modules defaultExtension对我来说是批判性的想法(我不知道为什么rxjs/*路径不会添加.js但是嘿嘿。)

这适用于48到最近的52。

答案 4 :(得分:0)

我有这个问题,结果是rxjs的版本问题 - 角度2.0.0-rc4需要rxjs-5.0.0-beta.6,我的jspm配置中有beta.10!