#angular
Вопрос:
Редактировать: Я решил проблему, это было потому, что я получал данные из модального компонента, который изменял порядок непосредственно внутри этого компонента. Я все еще не до конца уверен, почему это повлияло на компонент брата и сестры, поэтому, если кто-нибудь может объяснить, я был бы признателен, но на данный момент, похоже, проблема решена.
Я работаю над относительно крупным проектом, pwa для электронной коммерции, если быть точным. У меня есть страница заказов, на которой клиенты могут просматривать заказы, недавно я заметил некоторое странное поведение, возникающее в результате того, что при запуске события вывода из дочернего компонента родительский элемент пытается обновить дочерние представления. Кажется, я не могу понять, почему это происходит, поскольку, насколько я понимаю, это должно происходить только при изменении свойства, связанного с входными данными. Я все еще новичок в angular, поэтому, возможно, я что-то неправильно понимаю, поэтому, если у вас есть какое-либо представление, пожалуйста, предоставьте его. Я предоставлю соответствующий код, если вы считаете, что требуется больше, пожалуйста, дайте мне знать, и я смогу предоставить более подробную информацию.
html-режим из дочернего представления строка заказа-компонент нажмите кнопку событие вкл. запускает событие вывода из этого компонента в родительский
<div *ngIf="loaded" class="orderWrapper mx-auto">
<div class="d-flex cardHeader" style="justify-content: flex-start">
<div class="orderlineHeader">
<p class="">Order Placed</p>
<p>{{ order.orderCreated | date: "medium":"locale" }}</p>
</div>
<div class="orderlineHeader">
<p>Total</p>
<p>{{ order.totalCost | currency }}</p>
</div>
<div class="orderlineHeader" style="margin-left: auto">
<p>Order# {{ order.orderId }}</p>
<button
class="btn btn-link"
(click)="viewOrderDetail()"
data-bs-target="#orderDetailModal"
data-bs-toggle="modal"
style="padding-left: 0 !important; color :whitesmoke"
>
View Order Details
</button>
</div>
</div>
...
<div *ngFor="let ol of order.orderLines">
<div class="d-flex orderlineRow">
<div class="my-auto">
<div class="imgWrapper">
<img
class="olImg"
[src]="
'https://f002.backblazeb2.com/b2api/v1/b2_download_file_by_id?fileId='
ol.productImg[0].imgid
"
/>
</div>
строка заказа-компонент
export class MyOrderlineComponent implements OnInit
{
loaded = false;
orderTotal = 0.0;
@Input() order :Order = new Order();
@Output() productForReview :EventEmitter<string> = new EventEmitter();
@Output() orderForDetails :EventEmitter<Order> = new EventEmitter();
constructor(
private productService :ProductService
) { }
ngOnInit(): void
{
this.loaded = false;
console.log(this.order)
this.fetchProductImg();
}
fetchProductImg() :void
{
let observables = [];
for(let o of this.order.orderLines)
{
observables.push(this.productService.fetchProductImages(o.productId.toString()));
}
forkJoin(observables)
.subscribe(dataArray =>
{
console.log(dataArray);
for(let i = 0; i < dataArray.length; i )
{
this.order.orderLines[i].productImg = dataArray[i]
}
console.log(this.order)
this.loaded = true;
}, (error) =>
{
console.log(error)
})
}
selectProductForReview(productId) :void
{
this.productForReview.emit(productId);
}
viewOrderDetail() :void
{
this.orderForDetails.emit(this.order); //this is the output triggered by the
//button
}
}
родительский html
<div class="accordion-body">
<div class="newOrders" *ngIf="pastOrders.length > 0">
<app-my-orderline
*ngFor="let order of pastOrders"
[order]="order"
(productForReview)="handleReviewSelect($event)"
(orderForDetails)="handleViewOrderDetails($event)"
></app-my-orderline>
</div>
<app-my-view-order-modal [order]='orderDetailsView' (orderCancelled)='orderCancelledListener($event)' ></app-my-view-order-modal>
прослушиватель родительских событий
handleViewOrderDetails(order :Order) :void
{
console.log(order);
this.orderDetailsView = order;
}
теперь, насколько я понимаю, модальный должен быть единственным компонентом, из которого запускается обнаружение изменений, однако всякий раз, когда запускается событие щелчка, я получаю эту ошибку
он попытался повторно отобразить все представления компонентов строки заказа
Но я не понимаю, почему это происходит.
Спасибо.
Комментарии:
1. Просто чтобы добавить к этому, я изучил обнаружение изменений OnPush, и это не решило проблему. Кажется, что представления детей перерисовываются, но компонент ни в какой момент не регистрирует изменения с помощью ngOnChanges (), поэтому мне неясно, почему происходит такое поведение