javascript - 如何找到空字段并计算缺失字段的值
问题描述
我有一个 javascript 应用程序,我需要一个用于抵押贷款的计算器,所需的 UI 看起来像
唯一的问题是我不能有计算按钮,所以我必须验证空字段并进行计算,初始计算成功但如果用户想要删除单个字段,则删除字段的值会自动填充,我想防止,有没有办法做到这一点?
当前代码
如果条件
function checkForValues(){
if(this.state.loanAmount != 0 && this.state.noOfYears != 0 && this.state.interestRate != 0){
this.state.payment = this.state.loanAmount * ( (this.state.interestRate/12 * pow(1 + this.state.interestRate/12 , this.state.noOfYears) ) / ( pow(1 + this.state.interestRate/12 , this.state.noOfYears) - 1 ) )
}else if(this.state.payment != 0 && this.state.noOfYears != 0 && this.state.interestRate != 0){
this.state.loanAmount = this.state.payment / ( (this.state.interestRate/12 * pow(1 + this.state.interestRate/12 , this.state.noOfYears) ) / ( pow(1 + this.state.interestRate/12 , this.state.noOfYears) - 1 ) )
}
}
在更改处理程序上
onChange = e => {
this.setState({ [e.target.name]: e.target.value });
this.checkForValues();
};
<Label for='loanAmount'>Loan Amount</Label>
<Input
type='text'
name='loanAmount'
id='loanAmount'
className='mb-3'
placeholder='Loan Amount'
onChange={this.onChange}
/>
解决方案
您可以查看最后一次更改源自的字段,并确定从那里更新哪个字段,例如(从 react 抽象的代码,因此它在此处运行)
let pow = Math.pow;
let lastUpdatedByScript = null;
// Calc monthly payment based on formula at https://en.wikipedia.org/wiki/Mortgage_calculator
function checkForValues(e){
// Get elements of interest
let form = this.form;
let amountField = form.amount;
let paymentField = form.payment;
// Get values of interest
let amount = +amountField.value;
let years = +form.years.value;
let nPmnts = years * 12;
let rate = +form.rate.value / 100;
let mRate = rate / 12;
let payment = +paymentField.value;
// Work out field to update, if any
// If amount field changed, update payment
let fieldToChange = this == amountField? paymentField :
// If payment field changed, update amount
this == paymentField? amountField :
// If years or rate changed, update whichever of amount or payment
// was last changed by script (if either)
this == form.years || this == form.rate? lastUpdatedByScript : null;
// Only do something if have years and rate
if (years && rate) {
// Common factor, calc once
let f = mRate / (1 - (pow(1 + mRate, -nPmnts)));
// If changing payment field, calculate payment
if (fieldToChange == paymentField) {
paymentField.value = (amount * f).toFixed(2);
lastUpdatedByScript = paymentField;
// If change came from payment field, calculate amount
} else if (fieldToChange == amountField) {
amountField.value = (payment / f).toFixed(2);
lastUpdatedByScript = amountField;
}
}
}
document.querySelectorAll('input[type="number"]').forEach(inp => inp.addEventListener('change', checkForValues, false));
<form id="Calculator" onsubmit="return false;">
<table>
<tr><td>Term (years)<td>Rate (% pa)<td>Amount ($)<td>Monthly Payment ($)
<tr>
<td><input name="years" type="number" value="30">
<td><input name="rate" type="number" value="3.09">
<td><input name="amount" type="number">
<td><input name="payment" type="number">
<tr>
<td colspan="4"><input type="reset" value="Reset form">
</table>
</form>
您可能还希望临时突出显示由脚本更改的字段以引起用户的注意,否则他们可能看不到发生了什么。:-)
推荐阅读
- python - tkinter 中的 refreshText 小部件
- ios - Objective-c 语法和 C 语法的不同结果
- angularjs - Angular cli:在 ngUpgrade 混合项目中包含 angularjs 组件样式
- angularjs - 数据表第一列始终是可排序的
- java - 为什么 setOnTouchListener 后另一个不起作用(Android)
- laravel - Redis 连接 [缓存] 未配置 laravel 错误
- python - 分析来自 Kafka 消费者的消息
- forms - 如何向 symfony 小部件根元素添加一个类
- javascript - 带有浮动滚动条插件的handsontable
- react-native - 将 react-navigation 更新到 v3 后 undefined 不是对象