Ну, я знаю, что есть масса вопросов по этой проблеме, но даже после прочтения некоторых из них, я не могу решить свою проблему. Я попробовал решение с помощью changeDetectionRef, но либо я делаю это неправильно, либо оно просто не работает в моем случае.
К моей проблеме: я делаю бюджетную книгу, добавляю транзакции и прочее, все все было хорошо, пока я не добавил обзор баланса, который показывает общий баланс на счете и изменения, которые будут применены в этом месяце. Баланс отправляется от родителя (budget-book.component) ребенку (day.component) в директиве ngFor. Я вижу, что проблема, с которой я столкнулся, заключается в том, что одно и то же значение отправляется каждому ребенку, принимается, изменяется и впоследствии отправляется следующему ребенку. Я попытался создать массив в родительском объекте, в котором сохранен каждый balanceChange, и вместо этого он отправил сумму предыдущих дней, но это тоже не сработало. Я также думал о создании наблюдаемого.
budget-book.component. html
[...]
<ul class="days">
<app-day (addEvent)="addTransaction($event)" (removeEvent)="removeTransaction($event)" (balanceEvent)="updateBalance($event)"
*ngFor="let day of days; index as i" [date]="sendDate(this.date.getFullYear(), this.date.getMonth(), i + 1)"
[transactions]="getTransactions(i)" [balance]="balance"></app-day>
</ul>
[...]
budget-book.component.ts
[...]
balance: number;
ngOnInit(): void {
[...]
this.balance = 0;
}
[...]
updateBalance(balanceChange: number) {
this.balance += balanceChange;
}
день .component. html
<div class="header-balance-container">
<span [class.positive-number]="balance + balanceChange >= 0" [class.negative-number]="balance + balanceChange < 0" class="balance">{{balance + balanceChange | currency: 'EUR'}}</span>
<span [class.positive-number]="balanceChange >= 0" [class.negative-number]="balanceChange < 0 " class="difference" >{{balanceChange | currency: 'EUR'}}</span>
</div>
day.component.ts
@Input() balance: number;
balanceChange: number;
@Output() balanceEvent = new EventEmitter<number>();
ngOnChanges(): void {
this.balanceChange = 0;
if (this.transactions) {
this.transactions.forEach((transaction: Transaction) => {
this.balanceChange += transaction.value;
});
}
this.pushBalance();
// here is where i tried adding the changeDetectionRef
}
[...]
pushBalance() {
this.balanceEvent.emit(this.balanceChange);
}
Я занимаюсь этой проблемой уже несколько дней и не могу понять, как ее решить. Я был бы счастлив, если бы кто-то здесь мог объяснить мне, что я упускаю и каковы мои перспективы решения.
РЕДАКТИРОВАТЬ :
Служба сделала это для меня Для тех, кто интересуется моей глупостью, что-то простое решило проблему, которая беспокоила меня несколько дней.
import {Injectable} from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class BalanceService {
balanceActivities: number[];
constructor() {
}
setBalances(dayCount: number) {
this.balanceActivities = new Array(dayCount);
}
addBalance(day: number, balanceActivity: number) {
this.balanceActivities[day] = balanceActivity;
}
getBalanceToDate(day: number) {
let balance = 0;
this.balanceActivities.forEach((balanceActivity, index) => {
balance += balanceActivity;
if (index >= day) {
return balance;
}
});
return balance;
}
getBalance() {
let balance = 0;
this.balanceActivities.forEach((balanceActivity, index) => {
balance += balanceActivity;
});
return balance;
}
}