我正在与Angular Services挣扎,无法找出问题所在 .
我正在开发一个书籍应用程序(使用Promises) . 出于效率原因,我正在使用服务注入重构我的代码 . 我对所有的http请求使用该服务(后面有一个休息服务),在服务中正确检索数据但是没有办法在组件中获取它 . 要检查它是否正确完成,我在服务承诺中添加了一个console.log(populateBookList()) . 控制台显示正确的列表 .
我还在我的组件中添加了一个console.log来查看列表,它是空的 . 此外,组件簿列表在服务列表之前加载 . 我知道有些东西可疑,但无法找出哪里> _ <
任何线索,建议,[其他]将非常感谢!感谢你们!
这是我的组成部分:
import { Component, OnInit, Input } from '@angular/core';
import { Http } from '@angular/http';
import { Book } from '../domain/book';
import { Message } from 'primeng/primeng';
import { Author } from '../domain/author';
import { HttpService } from './service/http.service';
import { Observable } from 'rxjs/Observable';
@Component({
selector:'lib-book',
templateUrl:'./book.component.html',
providers: [HttpService]
})
export class BookComponent implements OnInit{
_httpService: HttpService;
urlRef:String;
books:Array<Book>;
authorList:Array<Author>;
public msgs:Message[]=[];
constructor(private httpService:HttpService, private http:Http){
this._httpService = httpService;
this._httpService.populateBookList(this.msgs);
this.books = this._httpService.getBooks();
}
ngOnInit(){
}
}
这是我的服务
import { Injectable } from "@angular/core";
import { Book } from '../../domain/book';
import { Http } from '@angular/http';
import { Author } from '../../domain/author';
import 'rxjs/add/operator/toPromise';
import 'rxjs/add/operator/map';
import { Observable } from "rxjs/Observable";
@Injectable()
export class HttpService{
private urlRef:String = "http://localhost:8080/Librarian-1.0/ws/";
private bookList:Array<Book>;
constructor(private http:Http){
this.bookList = new Array<Book>();
}
populateBookList(msgs){
this.http.get(this.urlRef+"book")
.toPromise()
.then(response => this.bookList = response.json() as Array<Book>)
.then(() => console.log(this.bookList))
.then(() => msgs.push({severity:'info', summary:'Book list',detail:'Loaded succesfully !'}))
.catch(() => msgs.push({severity:'error', summary:'Book list',detail:'Can not load list.'}));
}
getBooks():Book[]{
return this.bookList;
}
}
2 回答
改变你的两个功能:
你会得到你期望的结果 .
另一个解决方案是从Promises切换到map .
在我的情况下,我必须得到一个Json的已知对象 . 首先是服务!为此,我调用我的RS来检索一个类型为Observable的JSON>:
extractData方法处理响应(我将它作为一个方法单独使用,因为我稍后会重用它):
其次是我的组件 . 我在我的decoractor中将服务添加到我的提供者:
在构造函数中实例化它:
然后订阅(由Vivek Doshi显示,再次感谢!)到我的服务方法,错误和成功处理:
对于以后的引用,subscribe的工作方式如下:componentORservice.method() . subscribe(数据处理,错误处理,成功处理) .
再次感谢!
这是完整的代码:
服务:
和组件: