2017-04-19 49 views
0

這裏我有類似下面的菜單服務...角2個如何自定義接口的OnInit一樣

menu.service.ts

import { Injectable, EventEmitter } from '@angular/core'; 
     import { 
      Http, 
      Request, 
      Response, 
      RequestMethod, 
      Headers, 
      URLSearchParams, 
      RequestOptions, 
      ResponseContentType, 
     } from '@angular/http'; 
     import { Observable } from 'rxjs/Observable'; 
     import * as _ from 'lodash' 

     @Injectable() 
     export class MenuService { 

      constructor(public http: Http) {} 
      IsOnReady = false; 
      _onReady: EventEmitter<string> = new EventEmitter<string>(true); 

      data = []; 
      getData() { 

      return this.http.get('/api/Menus').subscribe(data => {  
        this.data = data.json() 
        this.IsOnReady = true; 
        this._onReady.emit('menu is ready'); 
       }); 

      } 


      onReady(callback) { 
       if (this.IsOnReady) { 
        callback(); 
       } 
       else { 
        this._onReady.subscribe(r => { 
         callback(); 
        }); 
       } 
      } 
     } 

在另一頁,我總是需要調用menu.onReady拿到菜單數據,然後做的東西后...

import { OnInit } from '@angular/core'; 
import { MenuService } from '../../../services/menu.service'; 


export class NewsComponentBase implements OnInit{ 

    NewsCategoryID:string 

    constructor(public menu: MenuService) { 
    } 

    ngOnInit() { 
     this.menu.onReady(() => this.active()); 
    } 

    active() { 
     this.NewsCategoryID= this.menu.data[0].NewsCategoryID; 
    } 
} 

如何實現像角的onInit接口,一些類似的代碼

import { MenuService,MenuOnReady} from '../../../services/menu.service'; 

export class NewsComponentBase implements MenuOnready { 

    NewsCategoryID:string 

    constructor(public menu: MenuService) { 
    } 

    MenuOnReady() { 
     this.NewsCategoryID= this.menu.data[0].NewsCategoryID; 
    } 
} 
+0

您訂閱的事件。沒有看到在任何地方完成,它甚至工作?我認爲正確的做法是使用您從其他兩個組件中訂閱的主題。如果你想定製一個生命週期鉤子,那麼使用ngDoCheck通常是一條可行的路。 – unitario

+0

嗨,謝謝!它運行良好,使用「menu.OnReady」。 我認爲界面「MenuOnReady」它不屬於角的生命週期鉤。它屬於「getData()」函數,當「getData」獲得數據時,那麼實現「MenuOnready」的每個類都可以直接使用菜單數據 – wangzhen

回答

1

我想你是不是想着「角2路」

如果我們按照官方指導https://angular.io/docs/ts/latest/tutorial/toh-pt4.html

你的方法getData應該返回一個承諾或可觀察到的,你必須訂閱中ngOnInit方法。

你的代碼應該是這樣的:

import { Injectable, EventEmitter } from '@angular/core'; 
     import { 
      Http, 
      Request, 
      Response, 
      RequestMethod, 
      Headers, 
      URLSearchParams, 
      RequestOptions, 
      ResponseContentType, 
     } from '@angular/http'; 
     import { Observable } from 'rxjs/Observable'; 
     import * as _ from 'lodash' 

     @Injectable() 
     export class MenuService { 

      constructor(public http: Http) {} 

      getData():Promise<any> { 
       return this.http.get('/api/Menus'); 
      } 
     } 

import { OnInit } from '@angular/core'; 
import { MenuService } from '../../../services/menu.service'; 


export class NewsComponentBase implements OnInit{ 

    NewsCategoryID:string 

    constructor(public menu: MenuService) { 
    } 

    ngOnInit() { 
     this.menu.getData().then(data => {  
        this.data = data.json() 
        this.active(); 
       }); 
    } 

    active() { 
     this.NewsCategoryID= this.menu.data[0].NewsCategoryID; 
    } 
} 
+0

您應該引用您正在使用的「官方指南」一節。此外,你的代碼片段中的一些評論不會受到傷害。 – Zze

+0

感謝您的幫助! 方法「getData」不是我的問題中的要點 我只是非常想知道如何實現像onInit這樣的接口。 – wangzhen