使用Angular2在一个简单的类构造函数中注入服务

时间:2016-07-27 18:12:23

标签: class typescript angular

我创建了一个类似这样的Message类

import { ReflectiveInjector } from '@angular/core';

import { ApiService } from '../api.service';

export class Message {
        timestamp: number;
        message: any;
        api: ApiService;

        constructor(message: any) {
                let injector = ReflectiveInjector.resolveAndCreate([ApiService]);
                this.api = injector.get(ApiService);
                this.timestamp = message.timestamp;
                this.message = message.message;
        }
}

我不是直接在构造函数参数中注入 ApiService ,因为我试图避免这种情况: let nm = new Message(message, this.api)
我不希望服务在参数中。

所以我使用的是ReflectiveInjector,但这段代码甚至不起作用。我收到此错误: EXCEPTION:错误:未捕获(在承诺中):没有Http的提供者! (ApiService - > Http)即使我以这种方式包含 HTTP_PROVIDERS

import { bootstrap } from '@angular/platform-browser-dynamic';
import { enableProdMode } from '@angular/core';
import { HTTP_PROVIDERS } from '@angular/http';

import { AppComponent, environment } from './app/';
import { appRouterProviders } from './app/app.routes';

if (environment.production) {
  enableProdMode();
}

bootstrap(AppComponent, [
        appRouterProviders,
        HTTP_PROVIDERS,
])
.catch(err => console.log(err));

如何使用构造函数实例化我的类并注入我的服务:
let nm = new Message(message);

由于

3 个答案:

答案 0 :(得分:3)

出于某种原因,我的答案被删除而没有解释,所以这里的答案是:

这正是我一直想知道的;如果您真的需要在代码中调用构造函数,那该怎么办?还需要在课堂上注入一些东西吗?例如,Angular2教程的Hero类是贫血的,不包含任何真实的功能。在我的应用程序中并非如此,我需要一个包含(很多)逻辑的域对象。

无论如何,这是我的方法:

@Injectable()
export class MessageFactory {
  constructor(private service: Service)

  build(data: any): Message {
    let message = new Message(data);
    message.service = this.service;
    return message;
  }
}

export class Message {
  service: Service;

  constructor(private data: any) {
    // Can't call service here but it's okay for me...
  }

  doSomethingWithService(): {
    this.service.doSomething(this.data);
  }
}

所以你可以在某处注入MessageFactory并创建Messages的新实例:

export class MessageExampleComponent {
  constructor(private messageFactory: MessageFactory) {}

  makeMessageDoSomethingWithService(): {
    let message = this.messageFactory.build({just: 'an', example: 'here'})
    message.doSomethingWithService();
  }
}

我不确定调用它MessageFactory是否是一个正确的术语,但我希望在某个主持人删除此帖子而不发表评论之前对此方法有反馈。

答案 1 :(得分:2)

你可以在做像这样的引导程序时使用它

let nm = new Message(message);

bootstrap(AppComponent, [ 
  APP_ROUTER_PROVIDERS,
  [provide(Message,{useValue:nm})],
]).catch(err => console.error(err));

并为此

  

EXCEPTION:错误:未捕获(承诺):没有Http的提供者!   (ApiService - > Http)

在服务中创建构造函数并导入 HTTP ,如下所示

import { Http, Response } from '@angular/http';
export class LoginService {

  constructor(private http: Http) {

  }
}
为此目的

  

哦对不起,这不是我想要上课的方式。对于每条消息   我正在聊天,我实例化了一条消息。我不想只想一个   全局Message类但有几个Message对象。

bootstrap(AppComponent, [ 
  APP_ROUTER_PROVIDERS,
  Message //you service here
]).catch(err => console.error(err));

答案 2 :(得分:1)

我使用 @Inject

解决了这个问题
import { Inject } from "@angular/core;

我认为它应该像这样工作

@Inject(ApiService) api: ApiService;

import { Injectable , Inject } from "@angular/core;
    @Injectable()
    export class apiService {
        public constructor(@Inject(Http)  private http: Http) {}

    }
import { ReflectiveInjector, Component } from '@angular/core';

import { ApiService } from '../api.service';

@Component({
     providers: [ HomeService  ]
})

export class Message {
        timestamp: number;
        message: any;
        api: ApiService;

        constructor(message: any, @Inject(ApiService) api:ApiService) {                                      
                this.timestamp = message.timestamp;
                this.message = message.message;
        }
}