Angular нг для карусели из переменной - PullRequest
2 голосов
/ 12 января 2020

Мне нужно создать карусель, которая показывает картинки из переменной в .ts. Я планировал использовать ngFor.

У меня есть карусель stati c Bootstrap 4:

 <div id="carouselExampleIndicators" class="carousel slide" data-ride="carousel">
    <ol class="carousel-indicators">
        <li data-target="#carouselExampleIndicators" data-slide-to="0" class="active"></li>
        <li data-target="#carouselExampleIndicators" data-slide-to="1"></li>
        <li data-target="#carouselExampleIndicators" data-slide-to="2"></li>
    </ol>
    <div class="carousel-inner">
        <div class="carousel-item active">
            <img src="assets/fortress.jpg" class="d-block w-100 carousel-pic" alt="...">
        </div>
        <div class="carousel-item">
            <img src="assets/fortress.jpg" class="d-block w-100 carousel-pic" alt="...">
        </div>
    </div>
</div>

И у меня есть переменная в файле .ts, которая называется pics : enter image description here

Теперь я попытался поместить ngFor карусель, а активная карусель - только первое изображение. Проблема:

  • Карусель выключена. Просто показываю три. Когда я пытаюсь установить ngFor , он не работает.
  • Слайд показывает первое изображение (активно), но второй слайд показывает то же изображение (потому что запускается l oop). снова), а затем останавливается, третье изображение не отображается.

Когда я попытался просто установить ngFor в качестве элемента карусели, он не работает, поскольку требует активный класс. Кроме того, элемент ? [0] .pin_photos.url просто получает первое изображение.

   <div id="carouselExampleIndicators" class="carousel slide" data-ride="carousel">
        <ol class="carousel-indicators">
            <li data-target="#carouselExampleIndicators" data-slide-to="0" class="active"></li>
            <li data-target="#carouselExampleIndicators" data-slide-to="1"></li>
            <li data-target="#carouselExampleIndicators" data-slide-to="2"></li>
        </ol>
        <div class="carousel-inner">
            <div class="carousel-item active">
                <img src="http://MYURL/public/PinPhotos/{{item?.pin_photos[0].url}}"
                    class="d-block w-100 carousel-pic" alt="...">
            </div>
            <div *ngFor="let pic of pics">
                <div class="carousel-item">
                    <img src="http://MYURL/public/PinPhotos/{{pic.url}}" class="d-block w-100 carousel-pic" alt="...">
                </div>
            </div>
        </div>
    </div>

Чего мне не хватает?

Ответы [ 3 ]

1 голос
/ 12 января 2020

Вы можете использовать OnPu sh обнаружение изменений , поэтому создайте немой компонент.

@Component({
    selector: 'app-carousel-items',
    changeDetection: ChangeDetectionStrategy.OnPush,
    template: `<div *ngFor="let pic of pics">
                 <div class="carousel-item">
                   <img src="http://MYURL/public/PinPhotos/{{pic.url}}" class="d-block w-100 carousel-pic" alt="...">
                 </div>
               </div>`,
})
export class CarouselItemsComponent  {
  @Input('pictures') pictures; // pass your pictures from this input  
}

Теперь ваш l oop больше не запускается.

0 голосов
/ 12 января 2020

Я использую ngFor первая переменная, чтобы установить класс для первого элемента

шаблон

<div id="carouselExampleCaptions" class="carousel slide" data-ride="carousel">
  <ol class="carousel-indicators">
    <li data-target="#carouselExampleCaptions"  *ngFor="let item of items;let index = index" [attr.data-slide-to]="index"></li>
  </ol>
  <div class="carousel-inner">
    <div class="carousel-item" *ngFor="let item of items;let index = index;let isFirst = first" [ngClass]="{active:isFirst}">
      <img [src]="item.url" class="d-block w-100" [alt]="item.title">
      <div class="carousel-caption d-none d-md-block">
        <h5 [textContent]="item.title"></h5>
        <p [textContent]="item.symmery"></p>
      </div>
    </div>
  </div>
  <a class="carousel-control-prev" href="#carouselExampleCaptions" role="button" data-slide="prev">
    <span class="carousel-control-prev-icon" aria-hidden="true"></span>
    <span class="sr-only">Previous</span>
  </a>
  <a class="carousel-control-next" href="#carouselExampleCaptions" role="button" data-slide="next">
    <span class="carousel-control-next-icon" aria-hidden="true"></span>
    <span class="sr-only">Next</span>
  </a>
</div>

вызвать карусель вручную, как это

  ngAfterViewInit(){
    $('#carouselExampleCaptions').carousel()
  }

демо ?

0 голосов
/ 12 января 2020

Я думаю, что ngFor изменит ваше html дерево.

попробуйте использовать:

<ng-container *ngFor="let pic of pics">

вместо:

<div *ngFor="let pic of pics">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...