У меня mat-nav-list выглядит так:
<mat-nav-list>
<mat-list-item *ngFor = "let draft of drafts$() | async">
<ng-container *ngIf = "getImageUrl$(draft) | async as imageUrl">
<img matListAvatar [src] = "imageUrl">
</ng-container>
<h1 matLine>{{draft.name}}</h1>
<p matLine>{{draft.description}}</p>
</mat-list-item>
</mat-nav-list>
Почему <img matListAvatar [src] = "imageUrl"> не отображает изображение, если getImageUrl$(draft) содержит pipe(delay())? Я использую задержку для имитации фактического вызова асинхронной службы.
Вы можете попробовать stackblitz демо здесь. Настройте демонстрацию, чтобы увидеть ожидаемое поведение без delay().
Это ошибка / поведение async pipe или mat-list-item или проблема с моим кодом?
Я заставил его работать, запустив его за пределами NgZone, а затем вручную запустив обнаружение изменений. Должно быть лучшее решение, но, возможно, это поможет: stackblitz.com/edit/angular-so-async-pipe-delay-xokvdk?file= app /…
Я хотел использовать асинхронный канал, потому что код выглядит чистым, но для этого сценария он не будет таким чистым (особенно при переходе к магическим вещам NgZone, хе-хе). В этом случае я вернусь к стилю без асинхронного канала. Цените вашу помощь и находки. :-)





Я думаю, это как-то связано с обнаружением изменений. Когда вы добавляете
tap(console.info)к вашемуObservable, вы увидите бесконечное количество операторов журнала, что означает, чтоgetImageUrl$(draft)будет отозван, как толькоObservableзавершит работу (то есть после задержки).