繁体   English   中英

Angular 2的Http服务未公开map()和其他RxJS函数

[英]Angular 2's Http service not exposing map() and other RxJS functions

有人知道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<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 () => { };
    });
} 

另一个更新 (咳嗽,对此感到抱歉,忘记了此选项)

如果要避免单独添加运算符,可以通过以下操作导入完整的Rx

import {Observable, Subject, ReplaySubject, etc...} from 'rxjs/Rx';

您将拥有所有运算符:)

更新alpha 50 (08/12/2015)

在发布alpha 49之后不久,他们发布了alpha50。此版本将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已更新,以显示此重大更改。 @jeffbcross问题#5642中有一条评论 ,阐明了很多事情。

引用该评论的一部分

模块化从一开始就是新RxJS项目的目标,直到最近,我们才真正开始认真考虑组成运算符而不是依赖Rx的分层发行版。

原始答案

实际上,RxJS和Angular2发生了重大变化。 因此,现在要使用像map这样的运算符,您必须分别导入它们。 您可以在此拉取请求中看到更改。 还有的已经是一个问题,你的问题。

我建议您坚持使用alpha47。但是对于需要和想知道解决方案是什么的每个人(例如在pull request中指定),都需要单独添加运算符。

你一定有这样的东西

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更新答案。

如果要使用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)然后,您可以使用主文件中的import行将map()和其他(或所有)RxJS运算符导入到应用程序中(在我的情况下为app.ts):

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

如果您只想导入map()来减小大小,则可以这样做:

import 'rxjs/add/operator/map';

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

您需要在组件中导入Rx映射运算符,例如

import 'rxjs/add/operator/map';

干杯!

与上面的内容相反,我发现我需要使用

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

node_modules defaultExtension是我的关键思考(我不知道为什么rxjs/*路径不添加.js但嘿。)

从48到最新的52。

我遇到了这个问题,事实证明这是rxjs版本的问题-angular 2.0.0-rc4需要rxjs-5.0.0-beta.6,我的jspm配置中有beta.10!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM