Angular 订阅角2
我希望我的ngOnInit函数执行以下操作: -使用此.structureRequest.sendRequest()对某些数据发出http请求,该请求工作正常,在收到数据后,使用此.viewNodes()函数开始查看数据。 我使用subscribe,但它不起作用,我认为我对subscribe函数做了一些错误。请帮忙:)Angular 订阅角2,angular,subscribe,Angular,Subscribe,我希望我的ngOnInit函数执行以下操作: -使用此.structureRequest.sendRequest()对某些数据发出http请求,该请求工作正常,在收到数据后,使用此.viewNodes()函数开始查看数据。 我使用subscribe,但它不起作用,我认为我对subscribe函数做了一些错误。请帮忙:) HomeComponent.ts import {Component} from '@angular/core'; import {Observable} from 'rxjs/
import {Component} from '@angular/core';
import {Observable} from 'rxjs/Observable';
import {StructureRequestService} from './StructureRequestService';
export class Content {
ok: boolean;
content = [];
}
@Component({
providers: [StructureRequestService],
styleUrls: ['app/home/home.css'],
templateUrl:'./app/home/homePageTemplate.html'
})
export class HomeComponent {
contentArray = [];
myRes: Content;
showAssigned:boolean = false;
showSubitems:boolean = false;
showUsers:boolean = false;
constructor(private structureRequest: StructureRequestService) {}
ngOnInit() {
this.structureRequest.sendRequest().subscribe( this.viewNodes());
}
viewNodes() {
this.myRes = this.structureRequest.result;
this.contentArray = this.myRes.content;
this.showAssigned = true;
}
}
import {Injectable} from '@angular/core';
import {Http, Response, Headers, RequestOptions} from '@angular/http';
import {Observable} from 'rxjs/Observable';
@Injectable ()
export class StructureRequestService {
result: Object;
//private myUrl = 'http://manny.herokuapp.com/audit/get/structure';
private myUrl = './app/home/nodes.json'; // local URL to structure APi
constructor (private http: Http) {
//use XHR object
let _build = (<any> http)._backend._browserXHR.build;
(<any> http)._backend._browserXHR.build = () => {
let _xhr = _build();
_xhr.withCredentials = true;
return _xhr;
};
}
sendRequest() {
let body = JSON.stringify({});
let headers = new Headers({ 'Content-Type': 'application/json'});
let options = new RequestOptions({
headers: headers
});
this.http.get(this.myUrl, options)
.map((res: Response) => res.json())
.subscribe(res => {this.result = res;
return this.result; });
}
}
从'@angular/core'导入{Injectable};
从'@angular/Http'导入{Http,Response,Headers,RequestOptions};
从“rxjs/Observable”导入{Observable};
@可注射()
导出类StructureRequestService{
结果:对象;
//私有myUrl=http://manny.herokuapp.com/audit/get/structure';
private myUrl='./app/home/nodes.json';//构造APi的本地URL
构造函数(专用http:http){
//使用XHR对象
让_build=(http)。_backend._browserXHR.build;
(http)。_后端。_browserXHR.build=()=>{
让_xhr=_build();
_xhr.withCredentials=true;
返回xhr;
};
}
sendRequest(){
让body=JSON.stringify({});
let headers=新的头({'Content-Type':'application/json'});
让选项=新的请求选项({
标题:标题
});
this.http.get(this.myUrl,选项)
.map((res:Response)=>res.json())
.subscribe(res=>{this.result=res;
返回this.result;});
}
}
3.因此,问题在于采取同步步骤:接收数据,而不是查看数据 当请求返回值时,您可能希望执行
this.viewNodes
,而不是执行this.viewNodes()的结果
这个
应改为
this.structureRequest.sendRequest().subscribe(() => this.viewNodes());
return this.http.get(this.myUrl, options)
.map((res: Response) => res.json())
.map(res => {
this.result = res;
return this.result;
});
前者执行this.viewNodes()
并将结果传递给subscribe()
,后者创建一个新的内联函数,该函数传递给subscribe()
。调用此内联函数时,将执行This.viewNodes()
如果要传递值sendRequest()
将返回
this.structureRequest.sendRequest().subscribe((result) => this.viewNodes(result));
更新
sendrequest()
不返回任何内容
应该是
return this.http.get(this.myUrl, options) ...
但这只适用于您在代码中使用它的方式,如果它返回一个可观察的
但是末尾的subscribe()
返回一个subscribe
return this.http.get(this.myUrl, options)
.map((res: Response) => res.json())
.subscribe(res => {this.result = res;
return this.result; });
因此,这应改为
this.structureRequest.sendRequest().subscribe(() => this.viewNodes());
return this.http.get(this.myUrl, options)
.map((res: Response) => res.json())
.map(res => {
this.result = res;
return this.result;
});
或
区别在于
do()
不修改流的值,也不需要返回任何内容。将转发从.map()
返回的值。如果要使用它,请确保导入了do
(如map
)。我已经尝试过这个.structureRequest.sendRequest().subscribe((结果)=>这个.viewNodes(结果));但是this.viewNodes无法启动super.works!谢谢你的解释。我已经标记了你的答案。和往常一样,冈特在堆栈溢出上的回复帮助了很多人做一些可能的重复