Angular 17. Как создать загрузку внутри цикла for?

У меня есть веб-сайт, который представляет собой видеогалерею моего YouTube, и эти видео построены в теге iframe. Но я хочу использовать некоторую загрузку в этом цикле for, потому что когда я открываю страницу, загрузка происходит медленно. Что я делаю?

Мой код:

`@for (link of youtubeLinks; track $index) {
    <div class = "video-container mx-1 mb-2">
      <iframe #youtubeVideos 
              width = "315" 
              height = "560" 
              [src] = "getVideoSrc(link)" 
              frameborder = "0" 
              allow = "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" 
               allowfullscreen>
       </iframe>
    </div>
 }`

Я использовал директиву @defer, но она не сработала.

Я хотел, чтобы каждый iframe загружался при прокрутке страницы или каждый из них загружался одновременно, а не все сразу после входа на страницу.

Тестирование функциональных 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
1
0
434
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы можете использовать @defer, но если вы внимательно прочитаете документацию, вы заметите

Тип блока, который можно использовать для отсрочки загрузки JavaScript для компонентов, директив и каналов, используемых внутри шаблона компонента.

Ваш элемент iframe не соответствует этому описанию. Итак, вам следует переместить iframe в отдельный компонент, а затем использовать @defer для обертывания вашего компонента.

    @defer (on viewport) {
      <app-video [src] = "link" [width] = "width" [height] = "height"/>
    }
    @placeholder { 
      <div [style.width.px] = "width" [style.height.px] = "height">Loading...</div>
    }

важно задать размер заполнителя вашего iframe, потому что в противном случае все заполнители вашего видео будут находиться в области просмотра, что приведет к немедленной загрузке каждого видео. Поэтому вам следует зарезервировать место на странице с помощью заполнителей фиксированных размеров, равных iframe.

Таким образом, когда вы открываете страницу, вы сначала увидите заполнитель, затем angular видит, что первый заполнитель находится в области просмотра, что приведет к загрузке первого компонента, затем, когда вы прокручиваете до второго - применяется тот же сценарий и т. д.

Результат: https://stackblitz.com/edit/stackblitz-starters-y1wozs?file=src%2Fmain.ts

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