[英]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.