Angular: Как я могу запрашивать изображения по мере необходимости для ускорения загрузки (используя ngx-bootstrap) - PullRequest
0 голосов
/ 01 июля 2019

Я делаю запрос к персональному API, который возвращает URL примерно 300 изображений (приблизительно) и все эти изображения, которые я должен показать их в карусели.

Проблема в том, что моя страница долго загружается, потому что, когда за дополнительную плату начинает загружаться 300 изображений. Карусель показывает 6 изображений за проход, и я хочу, чтобы вы загружали изображения, нажимая кнопку «СЛЕДУЮЩАЯ» или «ПРЕДЫДУЩАЯ», чтобы ускорить загрузку страницы. Это был бы правильный способ сделать это, верно?

Я начинаю с angular, и я впервые делаю заявление такого типа. Кто-нибудь может мне помочь? Я исследовал, но я не нашел много информации, которая помогает мне, или я не знаю терминологию того, что мне нужно использовать в этом случае.

Это код карусели , где я показываю комментируемые изображения, я использую NGX-BOOTSTRAP:

<div class="container" >
  <div class="d-flex justify-content-center align-items-center">

      <div class="d-flex align-items-center justify-content-center">
        <div> <span class="text-hot">
          <b>HOT</b> </span> </div>
      </div>
      <div id="div-redondo" class="d-flex ml-2 align-items-center justify-content-center">
          <div class="text-hot align-middle">
              list
          </div>
      </div>
  </div>
</div>


<!-- Imagen de Pre-Carga-->
<div class="container-fluid d-flex justify-content-center" id="cont-preCarga" *ngIf="preCarga">
    <img src="../../assets/images/slider/spinner.gif">
</div>

<app-modal  [inmueble]="this.inmueble2" class="modal fade" id="exampleModal2" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true"> </app-modal> 


<carousel [itemsPerSlide]="itemsPerSlide"
          [singleSlideOffset]="singleSlideOffset"
          [interval]="false"
          [noWrap]="noWrap">
  <slide class="col-md-2" *ngFor="let imagenPortada of this.hostlistService.inmuebles; let index=index" style="width: 500px;">
    <img src="{{url}}{{imagenPortada.id}}_{{imagenPortada.fotos[0]}}" alt="imagen de slide" style="display: block; width: 100%; height: 300px;">   <!-- <-----HERE IS WHERE I AM SHOWING THE IMAGES -->
    <!--<img src="../../assets/images/slider/logo.png" alt="imagen de slide" style="z-index: 10; width: 100%; height: 300px; position: absolute; left: 0; top:0;">-->
    <!-- <div class="carousel-caption">
      <h4>Slide {{index}}</h4>
    </div> -->
    
    <div class="row">
      <div class="col-12">  
        <p class="text-left text-precio"> <i class="fas fa-dollar-sign">
          </i> Precio: {{imagenPortada.precio | currency: 'USD':true:'1.2-2'}} 
        </p>
      </div>
    </div>
    <div class="row">
      <div class="col-12">  
        <p class="text-left"> <i class="fas fa-map-marker-alt"></i> Ubicacion: {{imagenPortada.precio | currency: 'USD':true:'1.2-2'}} 
        </p>
      </div>
    </div>
    <div class="row">
      <div class="d-flex col-12">
        <div class="cont-verDetalles d-flex justify-content-center">
          <button (click)="obtenerInfo(imagenPortada)" type="button" class="mt-2 btn btn-secondary" data-toggle="modal" data-target="#exampleModal2">Ver detalles</button>
        </div>
      </div>
    </div>
  </slide>
</carousel>

Это изображение карусели , где я показываю только 6 изображений, когда я нажимаю кнопку «NEXT» или «PREV», они запускаются одно за другим, чтобы показать следующее:

carousel

И здесь вы можете увидеть, чего я хочу избежать, - они загружают стопку изображений, которые мне не нужно показывать, пока они мне не понадобятся в карусели, поскольку их слишком много:

images

Как я мог сделать, чтобы избежать этого?

Я был бы очень признателен человеку, который может помочь мне с этим. Заранее спасибо.

1 Ответ

0 голосов
/ 01 июля 2019

Это хороший вопрос.Для начала у нас будет 2 массива

  • a masterArray, который содержит все URL-адреса изображений;
  • и imagesArray, который будет массивом, связанным с каруселью, у него будет только 1 изображение для начала ... это означает, что при загрузке страницы мы загрузили только одно изображение.
  • мы просто добавляем URL из masterArray в imagesArrayдля каждого события смены слайдов [название события: activeSlideChange];

релевантное HTML (карусель с одним слайдом):

<carousel (activeSlideChange)='gotChange()'>
  <slide *ngFor="let img of imagesArray; let idx of index"  >
    <img src="{{img}}" alt="slide {{idx}}" style="display: block; width: 100%;">
  </slide>
</carousel>

релевантное TS (карусель с одним слайдом):

import { Component, ViewChild } from '@angular/core';
import { CarouselComponent } from 'ngx-bootstrap';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  @ViewChild(CarouselComponent) myCarousel: CarouselComponent;
  name = 'Angular';
  masterArray = ['https://valor-software.com/ngx-bootstrap/assets/images/nature/1.jpg',
    'https://valor-software.com/ngx-bootstrap/assets/images/nature/2.jpg',
    'https://valor-software.com/ngx-bootstrap/assets/images/nature/3.jpg',
    'https://valor-software.com/ngx-bootstrap/assets/images/nature/4.jpg',
    'https://valor-software.com/ngx-bootstrap/assets/images/nature/5.jpg',
    'https://valor-software.com/ngx-bootstrap/assets/images/nature/6.jpg',
    'https://valor-software.com/ngx-bootstrap/assets/images/nature/7.jpg',
    'https://valor-software.com/ngx-bootstrap/assets/images/nature/8.jpg',
  ];
  imagesArray = ['https://valor-software.com/ngx-bootstrap/assets/images/nature/1.jpg'];
  loopcomplete: boolean = false;

  constructor() { }

  gotChange() {
    console.log('got change', this.myCarousel.activeSlide);
    if (!this.loopcomplete) {
      if (this.myCarousel.activeSlide + 1 < this.masterArray.length) {
        this.imagesArray.push(this.masterArray[this.myCarousel.activeSlide + 1]);
      } else { this.loopcomplete = true; }
    }
  }

}

завершено рабочий стек стека здесь

изображение, показывающее ленивую загрузку изображений enter image description here

ОБНОВЛЕНИЕ : в свете комментария опрашивающего ниже ... искомое событие slideRangeChange

относится HTML (карусель с несколькими слайдами):

<carousel [itemsPerSlide]="itemsPerSlide"
          [singleSlideOffset]="singleSlideOffset"
          [noWrap]="noWrap"
          (activeSlideChange)='gotChange()'
          (slideRangeChange)='gotRangeChange()'
          [showIndicators]='false'
          [interval]='false'
           >
  <slide *ngFor="let img of imagesArray; let idx of index"  >
    <img [src]="img" alt="slide {{idx}}" style="display: block; width: 100%;">
  </slide>
</carousel>

релевантно TS (карусель с несколькими слайдами):

import { Component, ViewChild } from '@angular/core';
import { CarouselComponent } from 'ngx-bootstrap';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  @ViewChild(CarouselComponent) myCarousel: CarouselComponent;
  name = 'Angular';
  masterArray = ['https://valor-software.com/ngx-bootstrap/assets/images/nature/1.jpg',
    'https://valor-software.com/ngx-bootstrap/assets/images/nature/2.jpg',
    'https://valor-software.com/ngx-bootstrap/assets/images/nature/3.jpg',
    'https://valor-software.com/ngx-bootstrap/assets/images/nature/4.jpg',
    'https://valor-software.com/ngx-bootstrap/assets/images/nature/5.jpg',
    'https://valor-software.com/ngx-bootstrap/assets/images/nature/6.jpg',
    'https://valor-software.com/ngx-bootstrap/assets/images/nature/7.jpg',
    'https://valor-software.com/ngx-bootstrap/assets/images/nature/8.jpg',
  ];
  imagesArray = ['https://valor-software.com/ngx-bootstrap/assets/images/nature/1.jpg',
    'https://valor-software.com/ngx-bootstrap/assets/images/nature/2.jpg',
  ];
  loopcomplete: boolean = false;
  itemsPerSlide = 2;
  singleSlideOffset = true;
  noWrap = true;
  activeRange = 0;

  constructor() { }

  gotRangeChange() {
    if (!this.loopcomplete) {

      if (this.activeRange + 2 < this.masterArray.length) {
        this.activeRange = this.activeRange + 2;
        this.imagesArray = this.imagesArray.concat(this.masterArray[this.activeRange]);
        this.imagesArray = this.imagesArray.concat(this.masterArray[this.activeRange + 1]);
      } else {
        this.loopcomplete = true;
      }
    }

  }
}

в комплекте рабочий стекблиц (мульти слайд карусельл)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...