Расчет расстояния в угловых - PullRequest
0 голосов
/ 29 января 2019

Я делаю приложение для расчета расстояния, используя угловой, который имеет,

HTML:

<form [formGroup]="form" *ngIf="showForm">
<div formArrayName="distance" >
<table>
  <thead>
      <th> From Distance (Km) </th>
      <th> To Distance (Km) </th>
      <th> Fare Per Kilometer </th>
    </thead>
    <tbody>
    <tr 
      *ngFor="let item of form.get('distance').controls; let i = index" 
      [formGroupName]="i">
      <td>
      <input type="number" 
        placeholder="From" 
        formControlName="from">
        </td>
      <td>
        <input type="number"
          placeholder="To" 
          formControlName="to">
      </td>
       <td>
        <input type="number"
          placeholder="Fare Per Km" 
          formControlName="farePerKm">
      </td>
     </tr>
    </tbody>
   </table>
  </div>
</form>

TS:

  selectedValues(e) {
    this.showForm = true;
    this.form = this.fb.group({
      distance: this.fb.array([]),
    });
    const control = this.form.controls.distance as FormArray;
    if (e.target.value === "V1") {
      this.vehicleOne.forEach(data => {
        control.push(this.fb.group({
          from: [data.from, Validators.required],
          to: [data.to, Validators.required],
          farePerKm: [data.farePerKm, Validators.required]
        }));
      });
    }
    else if (e.target.value === "V2") {
      this.vehicleTwo.forEach(data => {
        control.push(this.fb.group({
          from: [data.from, Validators.required],
          to: [data.to, Validators.required],
          farePerKm: [data.farePerKm, Validators.required]
        }));
      });
    }
  }

Приведенный выше код только для справки, весь код приведен здесь в рабочем примере https://stackblitz.com/edit/disable-group-control-value-on-another-control-value-for-itrxah

Требование: В этом примере выможно увидеть, что в раскрывающемся списке «Выбор» изначально указано «выбрать транспортное средство», при выборе любого из двух транспортных средств вы получите тариф за километр для транспортного средства на основе от и до км в таблице.

После этой таблицы есть три раскрывающихся списка: От местоположения, До местоположения, Общее пройденное расстояние , а в пустом поле ввода указано Общая стоимость проезда .

То, что я нахожусь внеобходимо, если пользователь выбирает Vehicle One(vehicle), Location A (From Location), Location C (To Location), 20KM (Total Distance travelled), тогда необходимо обновить общий ввод тарифа до значения 350.

На основе вышеуказанного выбора (где общее пройденное расстояние составило 20Km в транспортном средстве один) расчет будет,

дляe первые 5 KMS (0 - 5) , стоимость проезда 10 / км, поэтому 5 * 10 = 50 , где следующие 15 KMS (от 6 до 20) тариф составляет 20 / км, поэтому 15 * 20 = 300 .

Таким образом, общая стоимость проезда составила 50 + 300 = 350

.Сценарий только для примера, и вот так, если я выберу второе транспортное средство, тогда тариф должен рассчитываться в соответствии с его разбивкой на километры и тарифами / км.

Если выбор был таким, как указано выше, то общее значение для ввода тарифа,

<input type="number"
          placeholder="Fare Per Km" 
          formControlName="farePerKm">

необходимо обновить с вычисленным выше значением 350 в соответствии с приведенным выше примером, который зависит от выбора.

Редактировать: Пожалуйста, не делайтене беспокоиться о данной структуре, потому что в моем реальном приложении я использую карты для вычисления пройденного расстояния, теперь я сделал все это внутри формы.

Единственное требование - мне нужно получить общее количествостоимость проезда от общего расстояния, пройденного гонщиком в транспортном средстве, которое имеет вертел для расчета тарифавверх на основе км, как указано.

Ниже приведен разбитый автомобиль.Так что, если я еду в этом автомобиле один на 20 км, то общая стоимость проезда должна составлять 350 (например) для любого другого транспортного средства, отличающегося разделением.

From Distance (Km)  To Distance (Km)    Fare Per Kilometer

0                    5                   10

6                    20                  20

Ответы [ 2 ]

0 голосов
/ 30 января 2019

просто сделайте функцию для расчета цены.

Ну, прежде чем вы должны лучше определить «тарифы», в тарифах должны быть равны «и», то есть

vehicleOne: any = [{ from: "0", to: "5", farePerKm: "10" }, 
                   { from: "5", to: "20", farePerKm: "20" }, //<--"from" is equal to "to" above
                   { from: "20", to: "50", farePerKm: "5" }] //<--"from" is equal to "to" above

иначе, какова цена марки "6 км" с транспортным средством "V1"?

Функция проста:

  getPrice(vehicleID: string, distance: number) {
    //get the fare
    let fare: any[];
    switch (vehicleID) {
      case "V1":
        fare = this.vehicleOne;
        break;
      case "V2":
        fare = this.vehicleTwo;
        break;
    }
    let price: number = 0;
    let distanceCal = distance;
    fare.forEach(x => {
      let incprice=0;
      if (distanceCal > 0) {
        if (distance > +x.to)
          incprice += ((+x.to) - (+x.from)) * (+x.farePerKm);
        else
          incprice += (distance-(+x.from)) * (+x.farePerKm);

        price+=incprice
        distanceCal -= (+x.to) - (+x.from)
      }
    })
    if (distanceCal>0) //If the distance if greater than the last fare
      price+=distanceCal * (+fare[fare.length-1].farePerKm) //use the last farePerKm

    return price;
  }

Ну, с помощью переключателя для выбора тарифакакой-то странный.Вы можете улучшить код, если ваши тарифы будут иметь вид

vehicles: any = [
   { id: "V1", vehicleName: "Vehicle One", fares: [{ from: "0", to: "5", farePerKm: "10" }, { from: "5", to: "20", farePerKm: "20" }] },
   { id: "V2", vehicleName: "Vehicle Two", fares: [{ from: "0", to: "10", farePerKm: "15" }, { from: "10", to: "20", farePerKm: "12" }] }

И затем вы можете изменить функцию следующим образом:

getPrice(vehicleID: string, distance: number) {
    //get the fare
    let fare= this.vehicles.find(x=>x.id==vehicleID).fares;
    ....rest of the code...
}

ПРИМЕЧАНИЕ: как в ваших тарифах, от, до, так и на тарифеPerKm являются строками, вы должны преобразовать в число, используя «+». ПРИМЕЧАНИЕ2: вы должны проверить функцию.например, вы можете в ngOnInit - только для проверки - написать что-то вроде

for (let distance=0;distance<30;distance++)
      console.log(distance,this.getPrice("V1",distance))
0 голосов
/ 30 января 2019

Вот, пожалуйста.Я только добавил код, который мне пришлось добавить или настроить, чтобы решить вашу проблему.Обратите внимание, что это не полное решение, а подсказка, чтобы направить вас в правильном направлении.

В вашем AppModule добавьте FormsModule, чтобы иметь возможность использовать ngModule -направление.

import { ReactiveFormsModule, FormsModule } from '@angular/forms';

@NgModule({
imports:      [ BrowserModule, ReactiveFormsModule, FormsModule ],
...

Добавьте в свой файл TS следующие переменные:

protected totalFare: string;
protected chosenVehicle: any;
protected selectedDistance: any;

Также расширите список транспортных средств

vehicles: any = [
{ id: "V1", vehicleName: "Vehicle One", fares: [{ from: "0", to: "5", farePerKm: "10" }, { from: "6", to: "20", farePerKm: "20" }] },
{ id: "V2", vehicleName: "Vehicle Two", fares: [{ from: "0", to: "10", farePerKm: "15" }, { from: "11", to: "20", farePerKm: "12" }] }

]

И добавьте следующий метод

protected onDistanceSelection(): void {
    const vehicle = this.vehicles.filter(el => el.id === this.chosenVehicle)[0];
    this.totalFare = vehicle.fares[0].farePerKm;
}

В своем HTML-файле сделайте следующие корректировки:

<select (change)="selectedValues($event)" [(ngModel)]="chosenVehicle">
  <option value="undefined" disabled selected> Choose a vehicle </option>
  <option *ngFor="let vehicle of vehicles" [value]="vehicle.id"> {{  vehicle.vehicleName  }} </option>
</select>



 <select (change)="onDistanceSelection()" [(ngModel)]="selectedDistance">
     <option value="undefined"  disabled selected> Total distance of travel</option>
     <option value="10"> 10 KM </option>
     <option value="20"> 20 KM </option>
     <option value="30"> 30 KM </option>
     <option value="40"> 20 KM </option>
</select>


<input type="text" [(ngModel)]="totalFare" placeholder="Total fare">

Обратите внимание, что вы написали "undefined" неправильно в большей части вашего кода.Я исправил это здесь.В противном случае в раскрывающихся списках не будет отображаться текст «Выбрать ...» при запуске.

При использовании этого кода вы можете видеть, что при выборе транспортного средства и нажатии на кнопку «дистанция» текущее транспортное средство отображается втекстовое поле общей платы за проезд.

Дайте это, чтобы у вас была возможность начать вычисления самостоятельно внутри onDistanceSelection().У вас также есть доступ на selectedDistance здесь.

Веселитесь!;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...