将Angular2服务注入组件基类

Posted

技术标签:

【中文标题】将Angular2服务注入组件基类【英文标题】:Injecting Angular2 Service into components base class 【发布时间】:2017-04-09 14:22:39 【问题描述】:

我想为组件创建一个基类,以便能够在组件的生命周期中做一些常见的事情。我还需要基类来访问某些服务。我该如何注射?当然,我可以使用单例而不是服务,但我想即使不是打字稿也不会很刻板,因为单例在那里是一种反模式。 问候, 丹尼尔

编辑:

这是目前正在工作的,但我更希望将 ConnectionService @Injectable() 注入到 RemoteController 的构造函数中,就像 Angular2 文档说的那样,最好不需要将其添加到子组件提供者列表中。

子组件:

@Component(...)
export class SomeComponent extends RemoteController 
    sendRequest() 
        this.request('something');
    

基类:

export class RemoteController implements OnInit 
    public connection: SocketIOClient.Socket;
    constructor() 
        this.connection = RemoteService.connect('ws://localhost:8500');
    
    request(name: string) 
        this.connection.emit('request', name);
    
    ngOnInit() 
        ...
    

单例解决方案:

class ConnectionService 
    private sockets:  [key: string]: SocketIOClient.Socket ;
    constructor() 
        debugger;
        this.sockets = ;
     
    connect(url: string) 
        return (url in this.sockets) ? this.sockets[url] : io.connect(url);
    

let RemoteService = new ConnectionService();

export  RemoteService ;

【问题讨论】:

【参考方案1】:

Angular2 只支持构造函数注入。如果你有一个超类和一个子类,并且你想注入到超类中,你必须将构造函数参数添加到子类并转发给子类

export class RemoteController implements OnInit 

    constructor(public connection: SocketIOClient.Socket) 
        this.connection = RemoteService.connect('ws://localhost:8500');
    
@Component(...)
export class SomeComponent extends RemoteController 
    constructor(connection: SocketIOClient.Socket) 
      super(connection

【讨论】:

这绝对不是我想听到的。我还通过 ReflectiveInjector 阅读了一些关于程序化注入的信息,但我没有让它正常工作。在接受这个不满意的答案之前,我会进行更多调查(无论如何感谢 Günter) 如果使用ReflectveInjector,仍然需要注入应用程序注入器。我用示例代码发布了一些答案。我什至不会尝试解决问题,我认为这不会很好。 重要的是不要在基类的构造函数参数上添加“public”、“private”或“protected”,否则会发生冲突。该示例正确地不包含它们,但无论如何我都包含它们,直到我弄明白为止。

以上是关于将Angular2服务注入组件基类的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据注入从路由器创建的 Angular2 组件中?

typescript 一个示例,显示动态地将模板注入Angular2组件的方式

Angular2开发笔记

Angular2从另一个组件访问变量

Angular 2 - 基类包含子类模板

翻译对比Angular1和Angular2中的依赖注入