【问题标题】:DI abstract class instance, angular 5DI 抽象类实例,角度 5
【发布时间】:2018-02-07 19:04:56
【问题描述】:

我有几个组件应该同时获得三个服务并注入相同的实例。然后我想“生成”我的类的一个新实例,以便再次注入服务并不断地......
我的第一个想法是最好创建一个抽象类并在那里注入所有服务。然后我的任何组件都会扩展抽象类,但这种方法不起作用。

抽象类:

import { Component, Injector } from '@angular/core';
import {GeomqttdataproviderService} from '../protocols/geomqtt/geomqttdataprovider.service';
import {MqttdataproviderService} from '../protocols/mqtt/mqttdataprovider.service';
import {CoapdataproviderService} from '../protocols/coap/coapdataprovider.service';


@Component({
  selector: 'app-abstract',
  templateUrl: './abstract.component.html',
  providers: [
    MqttdataproviderService, GeomqttdataproviderService, CoapdataproviderService 
  ],
  styleUrls: ['./abstract.component.css']
})
export class AbstractComponent  {


  protected GeomqttdataproviderService: GeomqttdataproviderService;
  protected MqttdataproviderService: MqttdataproviderService;
  protected CoapdataproviderService: CoapdataproviderService;

  constructor(injector: Injector) {
    this.GeomqttdataproviderService = injector.get(GeomqttdataproviderService);
    this.MqttdataproviderService = injector.get(MqttdataproviderService);
    this.CoapdataproviderService = injector.get(CoapdataproviderService);
  }


}

消耗组件之一

    import { Component, OnInit, Injector } from '@angular/core';
    import {AbstractComponent} from '../../abstract/abstract.component';

    @Component({
      selector: 'app-gauge',
      templateUrl: './gauge.component.html',
      styleUrls: ['./gauge.component.css'],
      providers: [
        AbstractComponent
      ],
    })
    export class GaugeComponent extends AbstractComponent  {

      temp = [];

      data = [
        {
          name: '',
          value: ''
        }
      ];
    constructor(injector: Injector) {

        super(injector);


        this.CoapdataproviderService.msg$.subscribe(() => {
          this.temp = [{name: this.CoapdataproviderService.coapform.addcoaptopicfilter, value: this.CoapdataproviderService.msg}]; 
          this.temp = this.data;
          this.data = [{name: this.CoapdataproviderService.coapform.addcoaptopicfilter, value: this.CoapdataproviderService.msg.slice(-1)[0]  }];
        });

        this.GeomqttdataproviderService.geomsg$.subscribe(() => {
          this.temp = [{name: this.GeomqttdataproviderService.geomqttform.addgeomqtttopicfilter, value: this.GeomqttdataproviderService.geomsg}];  // nur das letzte wird angezeigt
          this.temp = this.data;
          this.data = [{name: this.GeomqttdataproviderService.geomqttform.addgeomqtttopicfilter, value: this.GeomqttdataproviderService.geomsg.slice(-1)[0]  }];

        });

         this.MqttdataproviderService.msg$.subscribe(() => {    
          this.temp = [{name: this.MqttdataproviderService.mqttform.addmqtttopicfilter, value: this.MqttdataproviderService.msg}]; 
          this.temp = this.data;
          this.data = [{name: this.MqttdataproviderService.mqttform.addmqtttopicfilter, value: this.MqttdataproviderService.msg.slice(-1)[0]  }];
        });
    }}


我总是收到我的所有服务都在仪表组件中丢失的错误。但我不想在 app.module 中声明它们,因为每次我在所有组件中注入抽象类时都需要一个新实例。

【问题讨论】:

    标签: angular typescript


    【解决方案1】:

    providers: [AbstractComponent] 没有意义,也不会像你期望的那样工作。它将创建一个可以注入的AbstractComponent 类的新实例,这在任何情况下都是不可取的。

    截至目前,decorator annotations cannot be inheritedproviders 属性应从 AbstractComponent 粘贴到所有子类中的 Component 注释。

    对于 DRYer 代码,可以在需要这些提供程序的所有类中导出和重用该数组:

    export const DATA_PROVIDERS = [
        MqttdataproviderService, GeomqttdataproviderService, CoapdataproviderService 
    ];
    
    ...
    @Component({
      selector: 'app-abstract',
      templateUrl: './abstract.component.html',
      providers: [DATA_PROVIDERS],
      styleUrls: ['./abstract.component.css']
    })
    ...
    

    【讨论】:

    • 但是,我如何为所有组件使用一个实例?当我在我的组件中提供 DATA_PROVIDERS 时,只有一个组件显示我的数据,但我希望所有消费组件同时显示我的数据!
    • 那么这与您在上一个问题 stackoverflow.com/questions/48627829/… 中尝试为相同的提供者做的事情相反。如果不需要多个提供者实例,则不需要在组件中定义providers,而是应该在模块中定义。
    • 我要做的是:使用一个带有自己实例的 DataProviderService 并在三个消费组件中同时显示数据。然后从同一个 DataProviderService 创建另一个实例,并在三个消费组件上显示数据,但现在使用新创建的 DataProviderService 的新实例。
    • 这取决于确定这三个组成部分的条件。它们在 DOM 中是否按 3 分组?您需要一个适当的注入器层次结构才能实现这一点。您遇到了 XY 问题。为了解决它,问题应该有明确的问题陈述来解释你的情况。 stackoverflow.com/help/mcve 说明如何使用这些服务和组件会很有帮助,不需要提供完整的类实现,它们可能有几行。
    猜你喜欢
    • 1970-01-01
    • 2013-10-31
    • 2017-02-05
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    相关资源
    最近更新 更多