有人知道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}}
答案 0 :(得分:31)
另一次更新 (咳嗽,抱歉,忘了这个选项)
如果您想避免单独添加运算符,可以通过执行
导入完整的Rximport {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!