Как я могу связать результат динамической формулы в поле ввода результата на основе динамического калькулятора с использованием Angular6?

У меня есть ситуация, когда мне нужно создать динамический калькулятор с динамическими полями. Например, если мне нужно сгенерировать «Калькулятор процентов», чтобы поля калькулятора были специфичными, и если мне нужно создать калькулятор «Сложных процентов», чтобы поля ввода калькуляторов определенно отличались. Оба калькулятора также будут иметь разные формулы. Так что мне удалось создать динамические калькуляторы.

у меня 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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
511
1

Ответы 1

Хороший вопрос, следующие 2 изменения в вашем стекблиц дадут то, что вы ищете:

Несколько заметок:

  • калькулятор может иметь ннg> количество полей
  • Я предполагаю, что оператор будет умножением (чтобы иметь любой другой оператор, просто измените математический оператор внутри цикла в функции 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 не работает.

Fahad Subzwari 19.02.2019 06:18

я не вставлял новый stackblitz... используйте свой stackblitz и обновите файл TS и HTML кодом из моего поста...

Akber Iqbal 19.02.2019 06:19

Но проблема здесь в том, что калькулятор будет генерироваться динамически, поэтому как я могу назначить событие изменения для динамически созданного второго последнего поля ввода (поле ввода перед полем результата)

Fahad Subzwari 19.02.2019 06:20

Кроме того, нет метода изменения для ввода. Существует событие ngModelChange для изменения входного значения ngModel.

Fahad Subzwari 19.02.2019 06:21

подождите - позвольте мне сделать новый stackblitz, который, надеюсь, прояснит ситуацию

Akber Iqbal 19.02.2019 06:22

Хорошо, но просто имейте в виду тот факт, что калькулятор будет создаваться динамически, так как у меня есть несколько разных калькуляторов, поэтому есть не только калькуляторы умножения и сложения. Поэтому я должен сделать его динамическим, чтобы создать динамический калькулятор и динамически назначать функцию обновления второму последнему полю (поле ввода перед полем результата).

Fahad Subzwari 19.02.2019 06:24

проверьте это: stackblitz.com/edit/…

Akber Iqbal 19.02.2019 06:39

Давайте продолжить обсуждение в чате.

Fahad Subzwari 19.02.2019 06:40

Другие вопросы по теме