当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Angular2的Http服务不暴露map()和其他RxJS函数》经验,为你挑选了3个好方法。

有人知道alpha 45和alpha 48之间的http是否有任何重大变化?我一直在寻找,我没有找到任何东西.我的问题是下面的代码在Alpha 45上完美运行.但是现在我已经升级到Alpha 48,_this.http.post(...).map is not a function当我尝试运行应用程序时,我收到一条错误消息.奇怪的是,IntelliSense显示http.post正在返回一个可观察的.这意味着地图功能应该可用.任何帮助,将不胜感激.谢谢!

public Authenticate(username: string, password: string): Observable {

    this.ResetAuthenticationValues();

    return Observable.create((subscriber: EventEmitter) => { 

        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 () => { };
    });
} 

Eric Martine.. 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.

更新

该更新日志被更新,以显示这个重大更改.有一个从@jeffbcross评论的问题#5642来阐明这个问题很多.

引用该评论的一部分

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

原始答案

关于RxJS和Angular2实际上有一个突破性的变化.所以现在使用像map你一样的运算符来单独导入它们.您可以在此拉取请求中看到更改.你的问题已经存在问题了.

我建议你坚持使用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如果你想要最新的,尽管他们把它锁定为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> Eric Martine..:

另一个更新 (咳嗽,对不起,忘了这个选项)

如果您想避免单独添加运算符,可以通过执行来导入完整的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.

更新

该更新日志被更新,以显示这个重大更改.有一个从@jeffbcross评论的问题#5642来阐明这个问题很多.

引用该评论的一部分

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

原始答案

关于RxJS和Angular2实际上有一个突破性的变化.所以现在使用像map你一样的运算符来单独导入它们.您可以在此拉取请求中看到更改.你的问题已经存在问题了.

我建议你坚持使用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如果你想要最新的,尽管他们把它锁定为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更新答案.


@EricMartinez虽然它在运行时有效,但Visual Studio仍然无法识别地图功能.VS有没有办法识别它?谢谢.

2> Michael Oryl..:

如果您想使用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()使用import主文件中的行导入和其他(或所有)RxJS操作符到你的应用程序中(在我的例子中是app.ts):

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

如果您只是map()为了保持大小而导入,那么您可以这样做:

import 'rxjs/add/operator/map';

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


对于那些来到这里的人来说,这是当前的工作解决方案,尽管接受的答案可能对以前的版本有用.

3> dheeran..:

您需要在组件中导入Rx贴图运算符

import 'rxjs/add/operator/map';

干杯!


我认为它比一个大段落短
这是一个很好的答案!简洁重要!
推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有