CdkVirtualFor ничего не отображает

У меня есть диалог со следующим кодом, который показывает несколько mat-card. Код отлично работает с ngfor и показывает то, что я ожидаю. Но т.к. количество карточек было большим, я решил использовать cdkScrolling , но при добавлении кода он ничего не показывал, хоть и отрисовывался в коде. И страница отображается почти пустой. Кто-нибудь знает, в чем проблема? Я неправильно реализовал?

диалог.html:

    <div style = "direction: rtl;position: relative" fxLayout = "row wrap" fxLayoutAlign = "space-around right">
  <ngx-spinner bdColor = "rgba(0, 0, 0, 0.8)" size = "medium" color = "#fff" type = "ball-clip-rotate"
               [fullScreen] = "false"></ngx-spinner>
  <div fxFlex = "100">
    <mat-card style = "text-align: center; font-size: 13px">
      <mat-card-header style = "flex-direction: row; box-sizing: border-box; display: flex;">
        <img mat-card-avatar #avatarPic [src] = "data.selectedPage.profilePicUrl"
             (error) = "avatarPic.src = 'assets/images/default_image-4_3-640x360.png'"
              >
        <mat-card-title>
          {{data.selectedPage.userName}}
        </mat-card-title>
        <mat-card-subtitle>
          {{data.selectedPage.bio}}
        </mat-card-subtitle>
        <span style = "width: 100%"></span>
        <button mat-button (click) = "close()">
          <mat-icon>keyboard_backspace</mat-icon>
        </button>
      </mat-card-header>
      <mat-divider style = "border-top: 1px solid rgb(103, 102, 102)!important"></mat-divider>
      <div fxLayout = "row wrap" fxLayoutAlign = "center center" style = "font-size: 16px;margin: 10px">
        <div fxFlex = "50"> تعداد دنبال کننده: {{data.selectedPage.followerCount}} </div>
        <div fxFlex = "50" style = "border-right: 1px solid rgb(103, 102, 102);">  تعداد دنبال شونده: {{data.selectedPage.followingCount}} </div>
      </div>
      <mat-divider style = "border-top: 1px solid rgb(103, 102, 102)!important"></mat-divider>
    </mat-card>
  </div>
  <cdk-virtual-scroll-viewport itemSize = "500">
  <div *cdkVirtualFor = "let media of medias" fxFlex = "33.33">
    <mat-card>
      <mat-card-content style = "height: 500px">
        <img #postImage (error) = "postImage.src = 'assets/images/default_image-4_3-640x360.png'"
             [src] = "media.imageUrl" style = "width: 100%;height: 256px">
        <p style = "height: 200px;overflow-x: hidden">{{media.caption}}</p>
      </mat-card-content>
      <button mat-button style = "width: 100%;margin-bottom: 5px">دریافت کامنت ها</button>
      <mat-divider></mat-divider>
      <mat-card-actions style = "padding: 10px;position: relative;display: flex">
        <div class = "show-profile-likes">
          <mat-icon style = "vertical-align: bottom;font-size: 15px">thumb_up_alt</mat-icon>
          {{media.likesCount}}
        </div>
        <div class = "show-profile-comments">
        <mat-icon style = "vertical-align: bottom;font-size: 15px">insert_comment</mat-icon>
        {{media.commentsCount}}
      </div>
        <div class = "show-profile-date">
          <mat-icon style = "vertical-align: bottom;font-size: 15px">insert_invitation</mat-icon>
          {{ media.takenAt | persianDate}}
        </div>
      </mat-card-actions>
    </mat-card>
  </div>
</cdk-virtual-scroll-viewport>
</div>
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
4
0
2 828
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужно будет определить высоту области просмотра. См. простую реализацию в Реализация CodeSandbox.

.cdk-viewport {
    height: calc(100vh - 60px);
    width: 100vw;
}
<cdk-virtual-scroll-viewport
    fxLayout = "row wrap"
    fxLayoutGap = "16px grid"
    itemSize = "400"
    class = "cdk-viewport"
  >
    <mat-card
      class = "mat-elevation-z4"
      *cdkVirtualFor = "let num of [1,2,3,4,5,6,7]"
    >
      <mat-card-header>
        <mat-card-title>Mountains {{num}}</mat-card-title>
      </mat-card-header>
      <img mat-card-image src = "./../assets/images/mountains.jpg" />
      <mat-card-content>
        <p>
          The Himalayas is a mountain range in Asia.
        </p>
      </mat-card-content>
      <mat-card-actions>
        <button mat-button>LIKE</button>
        <button mat-button>SHARE</button>
      </mat-card-actions>
    </mat-card>
  </cdk-virtual-scroll-viewport>

Вы должны импортировать ScrollDispatchModule:

import { ScrollDispatchModule } from '@angular/cdk/scrolling';

И добавьте его в массив inports в NgModule:

@NgModule({
  ...
  imports: [
    ScrollDispatchModule
  ],
  ...
})

Другие вопросы по теме