angular - 吸气剂构造可以在没有相关属性的情况下存在吗?
问题描述
例如,我有这样的代码
get isChart(): Observable<boolean> {
return this.isTemperatureChart.pipe(
withLatestFrom(this.isHypertensionChart),
map(([isTemperatureChart, isHypertensionChart]) => isTemperatureChart ||
isHypertensionChart)
);
}
或用于简化
get isChart(): boolean {
return this.isTemperatureChart && this.isSomeOtherPropertyTrue
}
很长一段时间,对我来说,很明显,如果我有复杂的二进制逻辑,并且不需要任何来自外部的属性,我应该使用过程。只是为了清晰的代码,我一直尝试使用吸气剂。但现在我想,关于这种结构的性质,找不到正确的答案。可以吗,仅将 getter 用于 GETTING,而不将其与某些类属性相关联?还是不是根据 OOP 和 getter/setter 的规范 - 仅用于封装类属性?
解决方案
您返回原始值的第二个示例是绝对正确的,但是您的第一个示例会导致问题,因为Observable
每次查询该属性时它都会创建一个新的(如果您async
在模板中使用管道,它会与它一起订阅)。使用 angular,这将是该组件的每个更改检测周期,并且每次您在组件 ts 中查询它。
在这种情况下,你真的不应该使用 getter。如果您希望消费者防止覆盖可观察对象,而只是读取它,则应设置readonly
访问修饰符。这会将您的示例更改为:
readonly isChart$: Observable<boolean> = this.isTemperatureChart.pipe(
withLatestFrom(this.isHypertensionChart),
map(([isTemperature, isHypertension]) => isTemperature || isHypertension)
);
不知道你的代码,但从变量的命名来看,感觉你最好使用combineLatest
而不是withLatestFrom
推荐阅读
- visual-studio-code - 在 Visual Studio Code 之上开发应用程序
- python - 如何从现有列表中选择数据并使用它们来构建新列表?
- swift - 如何使用 php 文件将谷歌云 sql 数据库链接到 swift?
- c++ - 带有 Vector 迭代器的 For 循环是否会复制值,从而使其效率低下?
- javascript - w2ui 组合输入在弹出窗口中不起作用
- prolog - 在Prolog中输出大于给定数字的整数
- azure-devops - ADF Git 使用 AzureResourceGroupDeployment 和 ARMTemplates 配置发布后断开连接
- reactjs - 用于导入多边形的 Openlayers 坐标格式?
- javascript - Simple Git 在单独测试时有效,但在大型项目 Node.js 中使用时无效
- assembly - 如何定义 NASM 程序集源中定义的 ELF 符号的大小?