将正确元素的数据从 ngfor 循环传递给子组件
Pass the right element's data from ngfor loop to the child component
我希望将来自父组件上的 ngfor 循环的数据注入到子组件中。当我在父组件模板上单击相应子组件模板的渲染时,该子组件应该在父组件的 ngfor 循环中使用正确元素的数据渲染模态(下面的代码显示 html 标签父模板上的子模板)。
到目前为止,子组件模块上的@input() saleItem: SaleItem;
属性只接受父组件模板上数组中第一个元素的数据,无论我点击哪个'sale item'在父组件的模板上。如何在 ngfor 循环中实现包含正确元素数据的每个模态渲染的预期行为?
已经尝试过
在子组件上使用更改。这是行不通的,我假设是因为 ngFor 循环中数组的引用实际上并没有改变。
编辑
所以我在开发工具中做了一些挖掘,这是 chrome 中“元素”选项卡的快照。
这表明数据实际上正在传递到单独呈现的子组件的模板中并显示在模态上,但是当我单击父组件模板上的任意位置时,只会触发具有第一个元素数据的模态。当我点击父组件模板上的 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>
所以我添加了一个函数,当在父组件模板上单击特定销售项目元素的图像时,它获取每个销售项目并将其手动分配给子组件销售项目变量。
父组件模板
<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;
}
对于每个组件,模态仍然每次都重新渲染,这有点拖累。理想情况下,我希望 Modal 渲染一次,并在单击图像时将每个项目的数据推送到它。这给出了 cannot read property of undefined
错误,因为当 angular 初始化组件时,子组件模型上的 @Input() saleItem
没有用任何值初始化。
因此,我目前对找到的解决方案还算满意,尽管当应用程序扩展时,性能可能会下降。
我希望将来自父组件上的 ngfor 循环的数据注入到子组件中。当我在父组件模板上单击相应子组件模板的渲染时,该子组件应该在父组件的 ngfor 循环中使用正确元素的数据渲染模态(下面的代码显示 html 标签父模板上的子模板)。
到目前为止,子组件模块上的@input() saleItem: SaleItem;
属性只接受父组件模板上数组中第一个元素的数据,无论我点击哪个'sale item'在父组件的模板上。如何在 ngfor 循环中实现包含正确元素数据的每个模态渲染的预期行为?
已经尝试过 在子组件上使用更改。这是行不通的,我假设是因为 ngFor 循环中数组的引用实际上并没有改变。
编辑
所以我在开发工具中做了一些挖掘,这是 chrome 中“元素”选项卡的快照。
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>
所以我添加了一个函数,当在父组件模板上单击特定销售项目元素的图像时,它获取每个销售项目并将其手动分配给子组件销售项目变量。
父组件模板
<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;
}
对于每个组件,模态仍然每次都重新渲染,这有点拖累。理想情况下,我希望 Modal 渲染一次,并在单击图像时将每个项目的数据推送到它。这给出了 cannot read property of undefined
错误,因为当 angular 初始化组件时,子组件模型上的 @Input() saleItem
没有用任何值初始化。
因此,我目前对找到的解决方案还算满意,尽管当应用程序扩展时,性能可能会下降。