javascript - 避免Angular组件中的许多if语句调用特定函数的最佳方法是什么?
问题描述
我正在Angular 7中创建一个温度转换应用程序,在我的formGroup中我有一个输入/输出值,以及2个多选,用户可以在其中选择一个温度单位“从”和“到”进行转换(摄氏度、华氏度或开尔文)。
当用户在我的组件中提交表单时,我得到输入数据
submitForm(data) {
this.input = data.input;
this.unitInput= data.unitInput;
this.unitTarget= data.unitTarget;
this.output= data.output;
}
我想只是添加 if 语句来调用将进行转换的函数,但现在查看我拥有的所有 if 语句似乎很多,而不是一个好的设计。
if (this.inputUnit === 'Celsius' && this.targetUnit === 'Fahrenheit') {
this.celsiusToFahrenheitConversion ();
}
if (this.inputUnit === 'Celsius' && this.targetUnit === 'Kelvin') {
this.celsiusToKelvinConversion ();
}
if (this.inputUnit === 'Celsius' && this.targetUnit === 'Rankine') {
this.celsiusToRankineConversion ();
}
If's for Fahrenheit, If's for Kelvin, If's for Rankine, etc.. 如果在功能中我想添加不同类型的单位呢?什么是更好的方法?
提前致谢
解决方案
我认为处理这个问题的最干净的方法是使用 switch 语句。没有比这更简单的了,我个人也讨厌它,但有时真的没有办法绕过它。
switch(this.inputType) {
case 'Celsius':
switch(this.targetUnit) {
case 'Fahrenheit':
this.celsiusToFahrenheitConversion();
break;
case 'Kelvin':
this.celsiusToKelvinConversion();
break;
case 'Rankine':
this.celsiusToRankineConversion();
break;
}
break;
case 'Fahrenheit':
break;
case 'Rankine':
break;
case 'Kelvin':
break;
}
然而!这是一个数学转换。F° 到 C° (32°F − 32) × 5/9
, F° 到 Kelvin 是(32°F − 32) × 5/9 + 273.15
, F° 到 Rankine 是32°F + 459.67
等等。哪里有数学,哪里就有系统。我的方法是创建一个转换表 - 一个对象,并将表单值用作查找值。例如:
const magicalLookupTable = {
celsius: {
fahrenheit: () => {
/** Implementation */
},
kelvin: () => {
/** Implementation */
}
},
fahrenheit: {
celsius: () => {
/** Implementation */
},
kelvin: () => {
/** Implementation */
}
}
}
推荐阅读
- javascript - 类似 Ajax 的按钮不显示计数增量,否则
- google-apps-script - google.script.run 不适用于某些用户的 Chrome 浏览器
- amazon-web-services - 将 CSV 从 Heroku Redis DB 导出到 AWS S3 存储桶
- python - 如何获取N维np数组中唯一数组元素的数量?
- kubernetes - 尽管选择器,Kubernetes 服务未创建端点
- flutter - Flutter:如何将条形码扫描值传递给 TextFormField
- java - 如何在 Resilience4j Spring starter 中配置事件
- python - python - 使用 BeautifulSoup 抓取网页的更有效方法
- android - 清除导航返回堆栈和重新创建活动
- node.js - 错误:监听 EADDRINUSE:地址已在使用 :::3000 - Digitalocean