Я работаю над сервисом. У него есть Observable, который используется для вывода товарных строк заказа.
Поток с начальными строками заказа (он может быть пустым)
linesOrder$: Observable<Line[]|any> = this.orderService.selectedOrder.pipe(
share(),
map(
(order: Order) => {
if (!order.lines) {
return of([])
}
return order.lines || of()
}
),
tap(data => console.log('data ', JSON.stringify(data)))
);
Затем я пытаюсь ответить при добавлении или удалении новой строки с использованием действий потока:
// Insert Action stream
private lineInsertedSubject = new Subject<Line>();
lineInsertedAction$ = this.lineInsertedSubject.asObservable();
linesWithAdd$ = merge(
this.linesOrder$,
this.lineInsertedAction$
).pipe(...);
addLine(newLine?: Line) {
this.lineInsertedSubject.next(newLine)
}
то же самое для удаления строки:
// Delete Action stream
private lineDeletedSubject = new Subject<Line>();
lineDeletedAction$ = this.lineDeletedSubject.asObservable();
linesWithDelete$: Observable<Line[]> = merge(
this.linesOrder$,
this.lineDeletedAction$
).pipe(...)
deleteLine(line: Line) {
console.info('eliminar linea');
this.lineDeletedSubject.next(line);
}
Дело в том, что я очень запутался, потому что я хочу для создания потока Line [], когда
- Я получил строки начального порядка
- При добавлении строки
- при удалении строки
итак, я создал это в сервисе:
updatedLines$ = merge(
this.linesOrder$,
this.linesWithAdd$,
this.linesWithDelete$
)
.pipe(
tap(data => console.log('updated'))
);
this updatedLines используется в компоненте следующим образом:
lines$ = this.lineService.updatedLines$;
затем в шаблоне:
<div *ngIf="lines$ | async as lines">
<p class="text-info">Selected lines: {{ lines.length }}</p>
<ion-card *ngFor="let line of lines">
<ion-card-header>
<ion-card-subtitle>{{ line.item_code }}</ion-card-subtitle>
</ion-card-header>
<ion-card-content>
<ion-item>
<ion-label class="label">Quantity</ion-label>
<ion-input type="number" step=".1" (keypress)="numberOnlyValidation($event)" value="{{ line.quantity }}"></ion-input>
<ion-button color="primary" (click)="onDelete(line)">remove</ion-button>
</ion-item>
</ion-card-content>
</ion-card>
</div>
Я не могу получить обновленные данные в шаблоне, когда я добавляю строку, она достигает метода addLine (), но updatedLines $ не передает. То же самое с deleteLine ().
Сначала я попробовал с combLatest, но обнаружил, что он будет генерировать только при испускании 3 потоков, мне нужно испустить значение, если испускается какой-либо из 3 потоков.