【问题标题】:Angular2 Injected custom service is undefinedAngular2注入的自定义服务未定义
【发布时间】:2016-11-07 11:35:14
【问题描述】:

我正在尝试将一个自定义服务 (MessageService) 注入另一个自定义服务 (ItemService)。它抛出错误 MessageServiceItemService 中未定义。
但是这两个服务(MessageService 和 ItemService)都可以与组件一起正常工作。

ma​​ni.ts

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app.module';
const platform = platformBrowserDynamic();
platform.bootstrapModule(AppModule);

app.module.ts

import { NgModule }      from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { AppComponent }   from './app.component';
import { routing, routedComponents } from './app.routing';
import { ItemService } from './services/item.service';
import { MessageService } from './services/message.service';
import './rxjs-extensions';


@NgModule({
  imports:      
  [ BrowserModule, 
    routing, 
    FormsModule, 
    ReactiveFormsModule,
    HttpModule,

  ],
  declarations: [ AppComponent, routedComponents],
  providers: [
    MessageService,ItemService 
  ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }

message.service.ts

import { Injectable } from '@angular/core';
import { Subject }    from 'rxjs/Subject';
import { Message } from '../models/message';

@Injectable()
export class MessageService {
    constructor() { }

    showError(msg: string) {
        console.log('MessageService Alert::'+msg);
    }

}

item.service.ts

import { Injectable } from '@angular/core';
import { Http, Response, Headers, RequestOptions } from '@angular/http';
import { Item } from '../models/item';
import { MessageService } from '../services/message.service'
import { Observable } from 'rxjs';

@Injectable()
export class ItemService {
private restUrl = 'http://localhost:3000/';  // URL to web api

  constructor(
    private http: Http,
    private msgService: MessageService) { }

  getAllItems(): Observable<Item[]> {
    return this.http
      .get(this.restUrl+'items')
      .map( (res: Response) => res.json() as Item[])
      .catch(this.handleError);
  }

  private handleError(error: any): Promise<any> {
    console.error('An error occurred', error);
    let errorMsg = error.message || error;
    this.msgService.showError("errorMsg"); // msgService is undefined here.
    return Promise.reject(errorMsg);
  }

}

这里的 msgService 在 ItemService 中是未定义的。 谁能帮我解决这个问题?

【问题讨论】:

    标签: angular angular2-services


    【解决方案1】:

    问题是this. 不是ItemService

    .catch(this.handleError);
    

    应该是

    .catch(this.handleError.bind(this));
    

    this. 继续指向handleError() 中的当前类实例

    【讨论】:

    • 哦,我明白了.. 但如果我这样做会得到打字稿错误,因为'Observable 不可分配给类型'Observable'。我仍然无法取得进展。
    • 我自己不使用 TypeScript,也不了解 TS 中的泛型(在 Plunker 中它们没有被检查)。也许.map&lt;Object,Item[]&gt;( (res: Response) =&gt; res.json() as Item[])
    • 更改.catch( res =&gt; { this.messageService.showAlert(res); return Observable.throw(res); }); 有效:-)
    猜你喜欢
    • 1970-01-01
    • 2016-09-02
    • 2016-05-16
    • 2017-08-08
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多