Передайте данные правого элемента из цикла ngfor в дочерний компонент - PullRequest
0 голосов
/ 19 апреля 2019

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

Пока что свойство @input() saleItem: SaleItem; в модели дочернего компонента принимает только данные первого элемента в массиве шаблона родительского компонента, независимо от того, какой «элемент продажи» я щелкаю по шаблону родительского компонента. Как мне добиться желаемого поведения каждого модального рендера, содержащего данные нужного элемента в цикле ngfor?

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

EDIT

Итак, я немного покопался в инструментах разработки, и это моментальный снимок на вкладке Элементы в Chrome. Elements tab snap Это показывает, что данные на самом деле передаются в шаблон отдельного рендеринга дочернего компонента и отображаются на модалах, но когда я щелкаю в любом месте шаблона родительских компонентов, запускается только модал с данными первых элементов. Как получить правильный модал для запуска, когда я нажимаю на элемент dom в шаблоне родительских компонентов, который должен запускать модал, как показано в прилагаемом коде? Модель родительского компонента

import { SaleItemsServices } from './../Services/saleItem-service.service';
import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-sales-page',
  templateUrl: './sales-page.component.html',
  styleUrls: ['./sales-page.component.scss']
})
export class SalesPageComponent implements OnInit {
  // other inits
  saleItems: any = [];

  imageUrl: String = this.saleItemsService.getItemImageURI();
  constructor(private saleItemsService: SaleItemsServices) {}

  ngOnInit() {
    console.log('im here');
    this.populateSaleItems();
  }
  populateSaleItems() {
    this.saleItemsService.getSalesItems().subscribe(
      data => {
        console.log('data available');
        this.saleItems = data;
        console.log(this.saleItems);
      },
      err => {
        console.log('there was an error fetching the data');
      },
      () => {
        console.log('done loading sale item data');
      }
    );
    console.log('sale items received are as such' + this.saleItems);
  }
}

Шаблон родительского компонента

<div id="backGroundImage">
  <div id="salesPageContainer">
    <div id="saleItemsContainer">
      <p id="banner">This is where the banner will come</p>
      <div
        *ngFor="let saleItem of saleItems"
        id="itemContainer"
        data-toggle="modal"
        data-target="#modalID"
      >
        <app-saleitem-modal [saleItem]="saleItem"></app-saleitem-modal>
        <img [src]="imageUrl + saleItem.imageID" alt="" id="itemImage" />
        <p id="itemName">{{ saleItem.itemName }}</p>
        <p id="itemPrice">{{ saleItem.itemPrice }}</p>
      </div>
    </div>
  </div>
</div>

Модель дочернего компонента

import { SaleItem } from './../../models/saleitem';
import {
  Component,
  OnInit,
  Input,
  OnChanges,
  SimpleChanges
} from '@angular/core';
import { SaleItemsServices } from '../../Services/saleItem-service.service';

@Component({
  selector: 'app-saleitem-modal',
  templateUrl: './saleitem-modal.component.html',
  styleUrls: ['./saleitem-modal.component.scss']
})
export class SaleitemModalComponent implements OnInit, OnChanges {
  @Input() saleItem: SaleItem;
  imageUrl: String = this.saleItemsService.getItemImageURI();

  constructor(private saleItemsService: SaleItemsServices) {}
  ngOnChanges(changes: SimpleChanges) {
    if (changes.saleItem) {
      console.log(
        'the previous value of sale items is' +
          JSON.stringify(changes.saleItem.previousValue)
      );
      console.log(
        'the new value of sale items is ' +
          JSON.stringify(changes.saleItem.currentValue)
      );
    }
  }
  ngOnInit() {
    console.log(this.saleItem);
  }
}

Шаблон дочернего компонента

<div class="modal fade" id="modalID">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h3 id="saleItemName">{{ saleItem.itemName }}</h3>
      </div>
      <div class="modal-body">
        <img
          [src]="imageUrl + saleItem.imageID"
          alt=""
          id="saleItemModalImage"
        />
        <p id="itemWeight">{{ saleItem.itemWeight }}</p>
        <p id="itemPrice">{{ saleItem.itemPrice }}</p>
        <p id="itemCompany">{{ saleItem.itemCompany }}</p>
        <p id="itemCategory">{{ saleItem.itemCategory }}</p>
        <!-- Body here -->
        <div class="modal-footer">
          <div class="col-6">
            <!-- Buttons here -->
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

1 Ответ

0 голосов
/ 19 апреля 2019

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

шаблон родительского компонента


  <div id="salesPageContainer">
    <div id="saleItemsContainer">
      <p id="banner">This is where the banner will come</p>
      <div *ngFor="let saleItem of saleItems" id="itemContainer">
        <img
          [src]="imageUrl + saleItem.imageID"
          alt=""
          id="itemImage"
          (click)="passSaleItem(saleItem)"
          data-toggle="modal"
          data-target="#modalID"
        />
        <app-saleitem-modal [saleItem]="saleItemToPass"></app-saleitem-modal>
        <p id="itemName">{{ saleItem.itemName }}</p>
        <p id="itemPrice">{{ saleItem.itemPrice }}</p>
      </div>
    </div>
  </div>
</div>

добавление модели родительских компонентов

passSaleItem(saleItem: SaleItem) {
    this.saleitemModal.saleItem = saleItem;
  }

Модалы по-прежнему визуализируются каждый раз заново для каждого компонента, что немного затрудняет работу. В идеале мне бы хотелось, чтобы модал отображался один раз, а при нажатии на изображение передавались данные для каждого элемента. Это дало ошибку cannot read property of undefined, поскольку @Input() saleItem в модели дочернего компонента не инициализировался никакими значениями, когда угловая инициализация компонентов.

Следовательно, в настоящее время я в порядке с решением, которое я нашел, хотя с потенциальным знаком вопроса о производительности в будущем, когда приложение масштабируется.

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