首页 文章

从服务到组件数组的角度

提问于
浏览
0

我正在与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 回答

  • 0

    改变你的两个功能:

    populateBookList(msgs){
           return this.http.get(this.urlRef+"book").map(response => {
                this.bookList = response.json() as Array<Book>;
                console.log(this.bookList);
                msgs.push({severity:'info', summary:'Book list',detail:'Loaded succesfully !'}
                return this.bookList;
           }).catch(() => msgs.push({severity:'error', summary:'Book list',detail:'Can not load list.'}));;
        }
    
    
        constructor(private httpService:HttpService, private http:Http){
            this._httpService = httpService;
            this._httpService.populateBookList(this.msgs).subscribe(res => {
                this.books = res;
            });
        }
    

    你会得到你期望的结果 .

  • 0

    另一个解决方案是从Promises切换到map .

    在我的情况下,我必须得到一个Json的已知对象 . 首先是服务!为此,我调用我的RS来检索一个类型为Observable的JSON>:

    getBooks():Observable<Book[]>{
            return this.http.get(this.urlRef+"book").map(this.extractData);
        }
    

    extractData方法处理响应(我将它作为一个方法单独使用,因为我稍后会重用它):

    extractData(res: Response){
            return res.json()
        }
    

    其次是我的组件 . 我在我的decoractor中将服务添加到我的提供者:

    @Component({
        selector:'lib-book',
        templateUrl:'./book.component.html',
        providers: [ HttpService ]
    })
    

    在构造函数中实例化它:

    constructor(private httpService:HttpService){}
    

    然后订阅(由Vivek Doshi显示,再次感谢!)到我的服务方法,错误和成功处理:

    ngOnInit(){ 
         this.httpService.getBooks()
          .subscribe(
              // opération à réaliser
              data => {this.books = data}, 
              // gestion de l'erreur
              ()=> this.msgs.push({severity:'error', summary:'Book list',detail:'Can not load list.'}), 
              // gestion de la réussite
              () => this.msgs.push({severity:'info', summary:'Book list',detail:'Loaded succesfully !'})) 
        }
    

    对于以后的引用,subscribe的工作方式如下:componentORservice.method() . subscribe(数据处理,错误处理,成功处理) .

    再次感谢!

    这是完整的代码:

    服务:

    import { Injectable } from "@angular/core";
    import { Http, Response } from '@angular/http';
    
    import { Observable } from "rxjs/Observable";
    
    import { Author } from '../../domain/author';
    import { Book } from '../../domain/book';
    
    @Injectable()
    export class HttpService{
    private urlRef:String = "http://your_url";
    
        constructor(private http:Http){
        }
    
        getBooks():Observable<Book[]>{
            return this.http.get(this.urlRef+"book").map(this.extractData);
        }
    
        getAuthors():Observable<Author[]>{
            return this.http.get(this.urlRef+"author").map(this.extractData);
        }
    
        extractData(res: Response){
            return res.json()
        }
    }
    

    和组件:

    import { Component, OnInit, Input } from '@angular/core';
    import { Http } from '@angular/http';
    import { Message } from 'primeng/primeng';
    
    import { HttpService } from './service/http.service';
    import { Observable } from 'rxjs/Observable';
    
    import { Book } from '../domain/book';
    import { Author } from '../domain/author';
    
    @Component({
        selector:'lib-book',
        templateUrl:'./book.component.html',
        providers: [ HttpService ]
    })
    
    export class BookComponent implements OnInit{
            books:Array<Book>;
            msgs:Message[]=[];
    
      constructor(private httpService:HttpService){
        }
    
        ngOnInit(){ 
         this.httpService.getBooks()
          .subscribe(
              data => {this.books = data}, 
              ()=> this.msgs.push({severity:'error', summary:'Book list',detail:'Can not load list.'}), 
              () => this.msgs.push({severity:'info', summary:'Book list',detail:'Loaded succesfully !'})) 
        }
    }
    

相关问题