angular - Angular 5 更改检测不会为提供 useValue 的提供程序触发
问题描述
我有一个简单的 Angular 5 应用程序,它由几个组件和服务组成,这些组件和服务使用“代理”耦合在一起,“代理”只是一个具有多个 RXJS 主题字段的对象,可用于从系统接收状态或调用命令。正在提供这些服务,但由于没有直接注入它们的组件,它们永远不会被创建。
为了解决这个问题,我使用该useValue
字段为他们提供,如下所示:
import { NgModule } from '@angular/core';
import { DataBroker } from './brokers/data.broker';
import { SystemBroker } from './brokers/system.broker';
import { NotificationBroker } from './brokers/notification.broker';
import { LoggerService } from './services/logger.service';
import { SocketService } from './services/socket.service';
import { DataService } from './services/data.service';
import { SystemService } from './services/system.service';
const systemBroker: SystemBroker = new SystemBroker();
const dataBroker: DataBroker = new DataBroker();
const notificationBroker: NotificationBroker = new NotificationBroker();
const loggerService: LoggerService = new LoggerService(systemBroker);
const socketService: SocketService = new SocketService(loggerService, systemBroker, notificationBroker);
const dataService: DataService = new DataService(loggerService, socketService, dataBroker);
const systemService: SystemService = new SystemService(loggerService, socketService, systemBroker);
@NgModule({
providers: [
{ provide: SystemBroker, useValue: systemBroker },
{ provide: DataBroker, useValue: dataBroker },
{ provide: NotificationBroker, useValue: notificationBroker },
{ provide: LoggerService, useValue: loggerService },
{ provide: SocketService, useValue: socketService },
{ provide: DataService, useValue: dataService },
{ provide: SystemService useValue: systemService },
]
})
export class AppServicesModule {
constructor() { }
}
这完成了创建实例的工作,但是我遇到了一个更痛苦的问题:在这些服务中接收并通过代理传递给组件的任何数据都不会启动更改检测。
编辑:根据要求,数据如何通过代理传递的示例(这只是一个示例片段,请记住,这个完全相同的代码适用于我的解决方法):
...
@Injectable()
export class DataService {
constructor(dataBroker: DataBroker, socketService: SocketService) {
socketService.on('NETWORK_CONFIG', (value: NetworkConfiguration) =>
dataBroker.networkConfiguration.status.next(value));
}
}
如果我以典型方式提供这些对象,即:
import { NgModule } from '@angular/core';
import { DataBroker } from './brokers/data.broker';
import { SystemBroker } from './brokers/system.broker';
import { NotificationBroker } from './brokers/notification.broker';
import { LoggerService } from './services/logger.service';
import { SocketService } from './services/socket.service';
import { DataService } from './services/data.service';
import { SystemService } from './services/system.service';
@NgModule({
providers: [
SystemBroker,
DataBroker,
NotificationBroker,
LoggerService,
SocketService,
DataService,
SystemService
]
})
export class AppServicesModule {
constructor(systemBroker: SystemBroker
dataBroker: DataBroker,
notificationBroker: NotificationBroker,
loggerService: LoggerService,
socketService: SocketService,
dataService: DataService,
systemService: SystemService) { }
}
然后一切都按预期工作。我可以将此用作解决方法,但我想了解useValue
它在这种情况下是否不起作用的用例。这是一个小问题,但如果有正确的方法可以做到这一点,那么我很想弄清楚。
我相信问题会出现:“为什么不直接使用服务?” 我们经常使用这种代理模式来允许我们更换服务实现而无需更改我们的组件。
解决方案
尝试使用工厂提供程序
let dataServiceFactory = (dataBroker: DataBroker, socketService: SocketService) => { return new DataBroker(dataBroker, socketService); };
export let dataServiceProvider= { provide: DataService, useFactory: dataServiceFactory, deps: [DataBroker, SocketService] };
@NdModule({
providers: [ dataServiceProvider ]
})
推荐阅读
- java - 如何在使用 edgeDriver selenium 时向 edgeOptions 添加参数
- ffmpeg - FFMPEG:选择原始和指定比特率的最小值
- selenium-webdriver - VS 2015 测试资源管理器没有显示测试
- html - 隐藏按钮并显示重定向文本
- python - 选择要从函数返回的函数
- ios - iOS:存档构建的行为与调试构建不同
- razor-pages - 将查询字符串添加到 CORE 剃须刀页面中的“asp-page”链接
- sql-server - 应用于 SQL 服务器的策略是否也适用于托管实例?
- python - tkinter:标签以扩展框架问题的端到端
- reactjs - 在 Markdown 的数组上使用 Gatsby-image