У меня есть ситуация, когда мне нужно создать динамический калькулятор с динамическими полями. Например, если мне нужно сгенерировать «Калькулятор процентов», чтобы поля калькулятора были специфичными, и если мне нужно создать калькулятор «Сложных процентов», чтобы поля ввода калькуляторов определенно отличались. Оба калькулятора также будут иметь разные формулы. Так что мне удалось создать динамические калькуляторы.
у меня 2 компонента. Один HomeComponent, а другой CalculatorComponent. Я звоню CalculatorComponent в HomeComponent. Я прохожу JSON от home.component.ts вот так
this.dynamicFormJson = {
heading : 'Percentage Calculator',
totalFields : 3,
inputs : [
{label : 'Percent', placeholder : 'Enter Percentage Here', type : 'number', variable : 'percent'},
{label : 'Amount', placeholder : 'Enter Amount Here', type : 'number', variable : 'amount'},
{label : 'Result', placeholder : '', type : 'number', variable : 'res'}
]
}
Вот мой calculator.component.ts код, в котором я создаю динамические переменные для каждого поля ввода и привязываю эти динамические переменные к динамически создаваемым полям ввода.
import { Component, OnInit , Input} from '@angular/core';
@Component({
selector: 'app-calculator',
templateUrl: './calculator.component.html',
styleUrls: ['./calculator.component.css']
})
export class CalculatorComponent implements OnInit {
@Input() formJson : any;
formInputsVar = {};
constructor() { }
ngOnInit() {
this.formJson.inputs.map((item : any)=>{
if (!this.formInputsVar[item.variable]) {
this.formInputsVar[item.variable] = '';
}
})
}
onSubmit(){
console.info(this.formInputsVar);
}
}
Благодаря этому подходу мне удалось создать динамический калькулятор и сгенерировать динамические переменные, а затем назначить поля ввода и получить значения из этого события щелчка onSubmit.
Вот мой полный рабочий код на
StackBlitz
Теперь я ищу, как я могу реализовать формулу таким образом, чтобы когда пользователь вводил значения в поля ввода, а затем он вычислял результат и отображал его в поле ввода результата в режиме реального времени, как двухсторонняя привязка Angular. Я добавлю формулу в объект json массива inputs, но я застрял на том факте, как я могу динамически реализовать формулу в полях ввода, потому что каждый калькулятор будет иметь разные JSON и разные формулы.
Если у меня есть формула в том же json калькулятора, как это
this.dynamicFormJson = {
heading : 'Percentage Calculator',
totalFields : 3,
inputs : [
{label : 'Percent', placeholder : 'Enter Percentage Here', type : 'number', variable : 'percent'},
{label : 'Amount', placeholder : 'Enter Amount Here', type : 'number', variable : 'amount'},
{label : 'Result', placeholder : '', type : 'number', variable : 'res'}
],
formula : "percent * amount / 100"
}
Итак, как я могу реализовать эту формулу на моем динамически созданном калькуляторе.
Примечание JSON калькулятора будет отличаться для каждого калькулятора, и формула также будет отличаться для каждого калькулятора.
Вы можете увидеть на справочном веб-сайте функциональность калькулятора. хочу точно такой же. Вы также можете проверить другие калькуляторы. Я использую Ангуляр6



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Хороший вопрос, следующие 2 изменения в вашем стекблиц дадут то, что вы ищете:
Несколько заметок:
updateResult - чтобы сделать его полностью динамическим, рассмотрите также возможность получения оператора в качестве пользовательского ввода)dynamicFormJson всегда будет использоваться для хранения рассчитанного результата (вот почему мы зацикливаемся с 0 - this.formJson.inputs.length-1)Добавлен updateResult() в калькулятор.component.ts, полный код:
import { Component, OnInit, Input} from '@angular/core';
@Component({
selector: 'app-calculator',
templateUrl: './calculator.component.html',
styleUrls: ['./calculator.component.css']
})
export class CalculatorComponent implements OnInit {
@Input() formJson : any;
formInputsVar = {};
constructor() { }
ngOnInit() {
this.formJson.inputs.map((item : any)=>{
if (!this.formInputsVar[item.variable]) {
this.formInputsVar[item.variable] = '';
}
})
}
updateResult(){
var tempMultiplicationValue =1;
for(var i=0; i<this.formJson.inputs.length-1; i++){
tempMultiplicationValue = tempMultiplicationValue * this.formInputsVar[this.formJson.inputs[i].variable];
}
//this.formInputsVar['res'] = this.formInputsVar['percent'] * this.formInputsVar['amount'];
this.formInputsVar['res'] = tempMultiplicationValue;
}
onSubmit(){
console.info(this.formInputsVar);
}
}
Добавлен(change) = "updateResult()" в калькулятор.component.html, полный код:
<div class = "row">
<div class = "col-md-6">
<form style = "margin:100px 0 0 100px;background-color: lightgrey; padding: 20px;">
<h2>{{formJson.heading}}</h2>
<div class = "form-group" *ngFor = "let inputRow of formJson.inputs">
<label for = "exampleInputEmail1">{{inputRow.label}}</label>
<input type = "{{inputRow.type}}" class = "form-control" [(ngModel)] = "formInputsVar[inputRow.variable]" [ngModelOptions] = "{standalone: true}" (change) = "updateResult()" aria-describedby = "emailHelp" placeholder = "{{inputRow.placeholder}}">
</div>
<button type = "submit" class = "btn btn-primary" (click) = "onSubmit()">Submit</button>
</form>
</div>
</div>
я не вставлял новый stackblitz... используйте свой stackblitz и обновите файл TS и HTML кодом из моего поста...
Но проблема здесь в том, что калькулятор будет генерироваться динамически, поэтому как я могу назначить событие изменения для динамически созданного второго последнего поля ввода (поле ввода перед полем результата)
Кроме того, нет метода изменения для ввода. Существует событие ngModelChange для изменения входного значения ngModel.
подождите - позвольте мне сделать новый stackblitz, который, надеюсь, прояснит ситуацию
Хорошо, но просто имейте в виду тот факт, что калькулятор будет создаваться динамически, так как у меня есть несколько разных калькуляторов, поэтому есть не только калькуляторы умножения и сложения. Поэтому я должен сделать его динамическим, чтобы создать динамический калькулятор и динамически назначать функцию обновления второму последнему полю (поле ввода перед полем результата).
проверьте это: stackblitz.com/edit/…
Давайте продолжить обсуждение в чате.
Это не работает должным образом. Я хочу, чтобы, когда пользователь будет вводить значение в последнее поле ввода перед полем ввода результата, результат должен отображаться в поле результата в режиме реального времени, как угловая двухсторонняя привязка. Ваша ссылка на stackblitz не работает.