角度4,如何传递提供者实例

2024-01-08

我有一个 Mqtt 服务,我可以从中获取一些实时数据(几何和温度)。
Mqtt 服务:

        import { Injectable } from '@angular/core';
        import {Paho} from '../../../../Own_paho_sript/geomqttws31';
        import {Subject} from 'rxjs/Subject';


        @Injectable()
        export class MqttdataproviderService {

          history = [
            {
              topic: '',
              timestamp: '',
              data: '',
              geometry: ''
            }
          ];

         mqttform = {

          addmqttadress: '',
          addmqttport: '',
          addmqttspatialfilter: '',
          addmqtttemporalfilter: '',
          addmqtttopicfilter: '',
          addmqttspatialrelation: '',
          addmqttusername: '',
          addmqttpassword: '',
          } ;

          private datamqtt = new Subject<any>();
          msg$ = this.datamqtt.asObservable();
          public msg = [];

         public constructor(private getformvaules: FormToClientService) {

         this.getformvaules.componentMethodCalled$.subscribe(
         () => {
         this.mqttform = this.getformvaules.addmqtt;
         this.methodToGetMyGeoData();
         });

         //to get live data and push the data in the history.
         this.methodToGetMyGeoData();
         }

          methodToGetMyGeoData() {
           // Methodes to subscrib and, connect to the paho 
            client

          this.client.onMessageArrived = (message: Paho.MQTT.Message) => {
              this.onMessage(message);
              this.history.push({
                'topic': message.destinationName,
                'timestamp': message.timestamp,
                'payloadstring': message.payloadString,
                'geometry': message.geometry
              });

          public onMessage(msg$: string) {
            this.geomsg.push(geomsg$);
            this.datageomqtt.next();

          }
          }

表单到客户服务:

import { Injectable } from '@angular/core';
import {Subject} from 'rxjs/Subject';

@Injectable()
export class FormToClientService {


  addmqtt = {

              addmqttadress: '',
              addmqttport: '',
              addmqttspatialfilter: '',
              addmqtttemporalfilter: '',
              addmqtttopicfilter: '',
              addmqttspatialrelation: '',
              addmqttusername: '',
              addmqttpassword: '',
              } ;
  };


  //Observable string sources
  private componentMethodCallSource = new Subject<any>();

  // Observable string streams
  componentMethodCalled$ = this.componentMethodCallSource.asObservable();

  // Service message commands
  callComponentMethod() {
    this.componentMethodCallSource.next();
  }

  setMqtt (adress: string, port: any, spatial: string, temporal: any, topic: string, username: string, relation: string) {
    this.addmqtt.addmqttadress = adress;
    this.addmqtt.addmqttport = port;
    this.addmqtt.addmqttspatialfilter = spatial;
    this.addmqtt.addmqtttemporalfilter = temporal;
    this.addmqtt.addmqttspatialrelation = relation;
    this.addmqtt.addmqtttopicfilter = topic;
    this.addmqtt.addmqttusername = username;
    console.log('set');
  }


我通过 4 个不同组件中的 Observables 订阅了历史数组。
1. 在地图中,2. 在数据表中,3. 在仪表中,4. 在折线图中。 它们都是完全相同的:

import {MqttdataproviderService} from '../../protocols/mqtt/mqttdataprovider.service';

@Component({
  selector: 'app-datatable',
  templateUrl: './datatable.component.html',
  styleUrls: ['./datatable.component.css'],
})
export class DatatableComponent  {
  rows = [];
  columns = [
    { prop: 'topic' },
    { name: 'payloadstring' },
    { name: 'geometry' },
    { name: 'timestamp' }
  ];
  constructor(private mqttprovider: MqttdataproviderService) {
      this.mqttprovider.msg$.subscribe(() => {
      this.rows = this.mqttprovider.history;
      this.rows = [...this.rows];
    });
}


我在我的 app.module 中将 MqttdataproviderService 全局声明为单例,并且一切正常!

但现在我想创建 MqttdataproviderService 的多个实例或动态实例。我有几个想要订阅的主题在地图组件中同时显示来自不同主题的几何数据或在数据表中。
对于每个组件(地图、数据表、折线图...)都存在一个自己的窗口。

我如何传递每个创建的 MqttdataproviderService 的实例?


Angular 提供者在它们定义的注入器中有单个实例。考虑到这里不需要单例,它不应该是在注入时实例化的类提供者(默认类型)。

If MqttdataproviderService类没有可注入的依赖项,它不一定是提供者。它可以被定义为价值提供者,主要是出于可测试性和可扩展性的原因:

{ provide: MqttdataproviderService, useValue: MqttdataproviderService }

如果它具有依赖项,则应在实例化时手动提供它们:

mqttprovider: MqttdataproviderService;

constructor(
  @Inject(MqttdataproviderService) private _MqttdataproviderService: typeof MqttdataproviderService,
  formToClientService: FormToClientService
) {
  this.mqttprovider = new this._MqttdataproviderService(formToClientService);
}

如果知道的话MqttdataproviderService类具有可注入的依赖项,可以使用工厂提供程序代替:

export function mqttdataproviderServiceFactory (formToClientService: FormToClientService) 
  return () => return new MqttdataproviderService(formToClientService);
}

...
{
  provide: mqttdataproviderServiceFactory,
  useFactory: mqttdataproviderServiceFactory,
  deps: [FormToClientService]
 }
...

然后是用于实例化的工厂函数MqttdataproviderService可以注入:

mqttprovider: MqttdataproviderService;

constructor(@Inject(mqttdataproviderServiceFactory) public mqttdataproviderServiceFactory: () => MqttdataproviderService) {
  this.mqttprovider = mqttdataproviderServiceFactory();
}

在这两种情况下FormToClientService将是一个单身人士。如果这是不可取的,则应以与MqttdataproviderService.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

角度4,如何传递提供者实例 的相关文章

随机推荐

  • Swift 3 / iOS 10 / TodayExtension - UserDefaults 始终返回 nil

    这是我在这个网站上的第一个问题 我有一个无法解决的问题 我正在开发一个带有 Today 扩展的简单笔记应用程序 我在 Swift 2 2 和 iOS 9 中没有遇到任何问题 问题只出现在 iOS 10 上的 Swift 2 3 和 Swif
  • 从 Python 访问 COM 方法

    我有一个旧的 Windows DLL 没有源代码 它实现了实用函数表 几年前 计划将其转换为 COM 对象 以便实现 IUnknown 接口 为了使用这个 DLL 有一个头文件 简化的 interface IFunctions public
  • 在编写 C 代码时如何优雅地利用 REV 和 RBIT 等 ARM 指令?

    我正在编写可以为 Arm Cortex M3 微控制器编译的 C 代码 该微控制器支持多种有用的指令 可有效操作寄存器中的位 包括 REV RBIT SXT 在编写C代码时 如果我需要那些特定的功能 如何利用这些指令 例如 我怎样才能完成这
  • Django:标记为已读“通知”

    我正在做一个学校项目 现在任何用户都可以提出问题 为了在任何用户提出问题时通知所有用户 我创建了一个新应用程序 并在提出问题时通过简单的 视图 通知他们 但这还只是普通的通知 用户打开 通知 选项卡后 如何将它们标记为已读 就像在社交网络上
  • 如何从浏览器读取客户端的机器/计算机名称?

    如何从浏览器读取客户端的机器 计算机名称 是否可以使用 JavaScript 和 或 ASP NET 您 有时 可以使用 IE 来完成此操作 因为我已经在只有 IE 的 Intranet 上的内部应用程序中完成了此操作 请尝试以下操作 fu
  • 按字符串选择列时,Dplyr 的 tbl_df 会出现意外行为

    通常 当以编程方式使用 dplyr 时 我希望通过名称选择列 其中列名称作为字符串存储在某个变量中 我注意到尝试使用 dplyr 执行此操作通常会导致意外结果 这似乎是由于 tbl df 的处理方式造成的 以下是一些示例 regular d
  • 如何将一个函数作为参数传递给另一个函数

    我想将一个函数作为参数传递给另一个函数 例如 void myFunction boolean coondition void function if condition function 在 Java 8 中这可能吗 不 你不能传递方法 但
  • 从c# 连接到oracle

    我正在尝试从 C 连接 Oracle 11g 我已关注 此链接 定义了连接别名 如下所示 moviess DESCRIPTION ADDRESS PROTOCOL TCP HOST localhost PORT 1521 CONNECT D
  • Entity Framework 4.1 Fluent API 中具有联接表和可选关系的一对多

    再次使用无法更改的旧数据库 并使用 Entity Framework 4 1 和 Fluent API 仅读取数据 public class Client Key public int ClientID get set public str
  • 如何 Dockerize Windows 应用程序

    我有一个 Windows 应用程序 我想将其容器化 它是一个 Windows 桌面应用程序 不是 Web 应用程序 我做了一些搜索 发现关于容器化桌面应用程序的信息很少 我想要容器化的应用程序在 WindowsServerCore 上运行良
  • Angular4 更改 md 按钮的波纹颜色

    我使用 Material for Angular4 在网页中创建了一个 md 按钮 有没有办法改变波纹效果的颜色并使其变为白色 我还可以更改其他波纹属性 例如波纹效果的持续时间吗 事实证明 为了更改波纹属性 应该在 mat ripple t
  • BehaviourSubject 初始值不适用于 share()

    share 运算符应用于BehaviorSubject BehaviourSubject 有初始值 目标是创建单个共享订阅 但是当BehaviorSubject有初始值时 这种共享订阅似乎不起作用 得到意想不到的结果 代码如下所示 let
  • 使用我自己的实体而不是 POCO 实体

    我正在使用实体框架 我可以使用自己的实体来代替 POCO 实体吗 我可以使用任何实体 或者实体名称和成员有任何限制吗 如果实体的成员与字段的名称不同 如何在 db 字段与实体的成员本身之间映射 UPDATE我已经拥有数据库广告一个大型项目
  • 将函数放入对象中与对其进行原型设计之间有什么区别?

    向对象添加函数和将函数原型化到对象上有什么区别 原型设计允许对象 模型调用自身吗 函数对象 通常用于对一组函数进行 命名空间 以便一个容器对象具有许多方法而不是许多全局函数 这样做的好处是保持代码组件按对象 可能还有对象层次结构 进行分类或
  • 三个值的中值

    我正在尝试编写一个 C 程序 它接受 3 个值作为函数参数并返回中位数 该程序运行得很好 直到我意识到它不能使用相同的值两次或更多次 例如 如果输入是 1 2 3 我得到 2 正确的中位数 但如果输入是 1 2 1 或 1 1 1 循环从头
  • 如何将列表转换为以索引作为值的字典?

    我正在尝试转换以下列表 l A B C 对于像这样的字典 d A 0 B 1 C 2 我尝试过其他帖子的答案 但没有一个对我有用 我现在有以下代码 d l i i for i in range len l 这给了我这个错误 unhashab
  • 检查类型是否可为 Null 的正确方法[重复]

    这个问题在这里已经有答案了 为了检查是否Type propertyType 可以为空 我正在使用 bool isNullable Nullable 1 Equals propertyType Name 有什么方法可以避免使用魔术字符串吗 绝
  • 当我的 JAR 位于类路径中时,为什么 Ant 会说“NoClassDefFound”?

    我正在使用 Java 1 6 Eclipse 和 Ant 以下是我创建 jar 文件并运行它的目标
  • 使用 scrapy 与 javascript __doPostBack 方法时出现问题

    尝试自动从公共搜索中抓取搜索结果 但遇到了一些麻烦 URL 的形式为 http www website com search aspx keyword page 1 sort Sorting 当我点击页面时 访问此页面后 它会略有变化 ht
  • 角度4,如何传递提供者实例

    我有一个 Mqtt 服务 我可以从中获取一些实时数据 几何和温度 Mqtt 服务 import Injectable from angular core import Paho from Own paho sript geomqttws31