我创建了一个这样的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);
谢谢
解决方法
出于某种原因,我的答案被删除而没有解释,所以这里的答案是:
这正是我一直想知道的;如果您真的需要在代码中调用构造函数,那该怎么办?还需要在课堂上注入一些东西吗?例如,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并创建Message的新实例:
export class MessageExampleComponent { constructor(private messageFactory: MessageFactory) {} makeMessageDoSomethingWithService(): { let message = this.messageFactory.build({just: 'an',example: 'here'}) message.doSomethingWithService(); } }
我不确定调用它MessageFactory是否是一个正确的术语,但我想在一些主持人删除这篇文章而不发表评论之前对这种方法有反馈.