В моем компоненте angular у меня есть список элементов корзины, которые можно изменить с помощью входов (каждый элемент имеет свой собственный вход), в котором есть (change)=onChange($event, cartItem)
. onChange()
подталкивает cartItem с измененной суммой к Subject
. Каждый элемент имеет тип:
export class CartItemOutput {
user_id: number;
item_id: number;
amount: number;
price: number;
item_name: string;
photo: string;
}
Я хочу выполнять вызовы API только в том случае, если есть элемент корзины, который последний раз изменялся некоторое время go (сейчас это 500 мс), и изменение не привело к то же количество. В моем ngOnInit()
у меня есть:
ngOnInit(): void {
this.subject
.pipe(
debounceTime(500),
distinctUntilKeyChanged("amount")
)
.subscribe((data: CartItemOutput) => {
//log modified item
console.log(data);
});
}
Если я удалю distinctUntilKeyChanged("amount")
, все будет работать так, как я ожидал, и элемент корзины регистрируется в консоли, только если он не был изменен за последние 500 мс. Но я не хочу регистрировать, если количество элемента было изменено, например, с 2 до 1 и обратно до 2. Проблема в том, что при distinctUntilKeyChanged("amount")
элемент регистрируется только один раз.
EDIT
При дальнейшем осмотре я обнаружил, что когда я изменил:
.pipe(
debounceTime(2000),
distinctUntilKeyChanged('amount')
)
на
.pipe(
debounceTime(2000),
distinctUntilChanged((p,q) => {
console.log(p);
console.log(q);
return p.amount == q.amount
})
)
Два значения p и q точно такие же при редактировании одного и того же элемента (Когда я редактирую элемент с идентификатором, например 2, и измените его количество, скажем, 7, и p, и q имеют количество 7). Затем, когда я редактирую другой элемент, p и q разные, и data
регистрируется в консоли.