Необходимо привязать значение от компонента к представлению (используется * NgFor)

Я использовал *ngFor для создания 3 карт, при нажатии 2 кнопок +/- счетчик должен увеличиваться/уменьшаться. Я привязал измененное значение счетчика к шаблону, но на него реагирует счетчик (Cntr) всех карт. Я хочу, чтобы отдельные карты реагировали на нажатие соответствующей кнопки с соответствующей карты

<form [formGroup]="checkoutData" (ngSubmit)="submitData($event)">
  <div class="allCards">
    <div *ngFor="let card of cardArray; let i=index" >
      <mat-card class="example-card">
        <mat-card-header>
          <p class="productOffer">20% OFF</p>
        </mat-card-header>

          <img  mat-card-image src="https://material.angular.io/assets/img/examples/shiba2.jpg"
            alt="Photo of a Shiba Inu">
            <mat-card-subtitle>{{card.name}}</mat-card-subtitle>
        <mat-card-content>

            <del >₹{{card.orgAmt}}</del>
            <p ngDefaultControl formControlName="discountedAmt">₹{{card.discAmt}} </p>
        </mat-card-content>


        <mat-card-actions>

          <div class="actionItems">
            <mat-form-field style="width:150px;">
              <mat-select  placeholder="Select Quantity">
                <mat-option ngDefaultControl formControlName="foodQuantity" *ngFor="let food of card.foods" [value]="food.value">
                  {{food.viewValue}}
                </mat-option>
              </mat-select>
            </mat-form-field>

            <span class="add-to-cart">
              <button  mat-mini-fab color="primary" (click)="decrCntr(i)" >-</button>
              <span ngDefaultControl formControlName="foodQuantity1">{{cntr}}</span>
              <button  mat-mini-fab color="secondary" (click)="incrCntr(i)" >+</button>
            </span>
          </div>
          <button mat-button type='submit'>Add to Cart</button>

        </mat-card-actions>
      </mat-card>
    </div>
  </div>
</form>

Вот мой файл .ts, где я добавляю +/- переменную Cntr и привязываю это значение к шаблону.

export class CartviewComponent implements OnInit {
cntr: number = 1
checkoutData: FormGroup
orgAmt: number;
discAmt: number;


constructor(private formBuilder: FormBuilder) { }

cardArray = [
{
  name: 'Onion', orgAmt: 30, discAmt: 25, counterVar: 1,
  foods: [{ value: 500, viewValue: '500gm' }, { value: 1, viewValue: '1kg' }, { value: 2, viewValue: '2kg' }],
},
{
  name: 'Potato', orgAmt: 20, discAmt: 15, counterVar: 1,
  foods: [{ value: 500, viewValue: '500gm' }, { value: 1, viewValue: '1kg' }],
},
{
  name: " beet", orgAmt: 10, discAmt: 8, counterVar: 1,
  foods: [{ value: 500, viewValue: '500gm' }, { value: 1, viewValue: '1kg' }, { value: 2, viewValue: '2kg' }],
 }
]

ngOnInit() {
this.checkoutData = this.formBuilder.group({
  discountedAmt: [null, Validators.required],
  foodQuantity: [null, Validators.required],
  foodQuantity1: [null, Validators.required],
})

}

decrCntr(cntrMain) {
if (this.cntr != 1)
  this.cntr -= 1

}

incrCntr(cntrMain) {
this.cntr += 1
}

submitData(formData) {
console.log("formData ", formData);

 }
 }

person Pravin Pokharkar    schedule 19.02.2019    source источник
comment
Вам нужен FormArray вместо массива JS.   -  person AJT82    schedule 19.02.2019
comment
Вот пример, который должен помочь: stackoverflow.com/a/42975138/6294072, хотя формат находится во вложенной группе, но в итоге идея та же :)   -  person AJT82    schedule 19.02.2019
comment
@ AJT_82 Спасибо за ваше ценное предложение и время. Я прошел через это. Но ошибка была другой. Я решил это. Проверьте ответ ниже.   -  person Pravin Pokharkar    schedule 20.02.2019


Ответы (1)


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

 <span class="add-to-cart">
              <button  mat-mini-fab color="primary" (click)="decrCntr(i)" >-</button>
              <span ngDefaultControl formControlName="foodQuantity1">{{card.counterVar}}</span>
              <button  mat-mini-fab color="secondary" (click)="incrCntr(i)" >+</button>
            </span>

и .ts файл

   decrCntr(cntrMain) {
  if (this.cardArray[cntrMain].counterVar != 1)
  this.cardArray[cntrMain].counterVar -= 1
}

incrCntr(cntrMain) {
this.cardArray[cntrMain].counterVar += 1
}
person Pravin Pokharkar    schedule 20.02.2019