我想要我的ngOnInit函数做下一件事:
– 使用this.structureRequest.sendRequest()对某些数据进行http请求,这样可以正常工作,并且在收到数据后开始使用this.viewNodes()函数查看它.
我使用订阅,但它不起作用,我认为我做订阅功能有问题.请帮忙:)
– 使用this.structureRequest.sendRequest()对某些数据进行http请求,这样可以正常工作,并且在收到数据后开始使用this.viewNodes()函数查看它.
我使用订阅,但它不起作用,我认为我做订阅功能有问题.请帮忙:)
> HomeComponent.ts
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; } }
2.这是http服务,http get工作正常,收到的所有数据:
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; }); } }
3.问题是制定同步步骤:接收数据,而不是查看数据.
解决方法
您可能希望在请求返回值而不执行this.viewNodes()的结果时执行this.viewNodes
这个
this.structureRequest.sendRequest().subscribe( this.viewNodes());
应改为
this.structureRequest.sendRequest().subscribe(() => this.viewNodes());
前者执行this.viewNodes()并将结果传递给subscribe(),后者创建一个新的内联函数,该函数传递给subscribe().调用此内联函数时,执行this.viewNodes()
如果你想传递值sendRequest()返回它应该是
this.structureRequest.sendRequest().subscribe((result) => this.viewNodes(result));
更新
sendReqeust()不返回任何内容.
它应该是
return this.http.get(this.myUrl,options) ...
但是这只能在你的代码中使用它的方式,如果它返回一个Observable.
但最后的subscribe()返回一个订阅
return this.http.get(this.myUrl,options) .map((res: Response) => res.json()) .subscribe(res => {this.result = res; return this.result; });
因此应该改为
return this.http.get(this.myUrl,options) .map((res: Response) => res.json()) .map(res => { this.result = res; return this.result; });
要么
return this.http.get(this.myUrl,options) .map((res: Response) => res.json()) .do(res => { this.result = res; });
不同之处在于do()不会修改流的值,也不需要返回任何内容.从.map()返回的值将被转发.如果要使用,请确保导入do(如map).