Попытка заполнить загрузочную карусель изображениями, используя угловые шаблоны - PullRequest
0 голосов
/ 24 июня 2018

Я пытаюсь динамически заполнить загрузочную карусель скриншотами.Все работает, кроме фактического переключения скриншотов.Я узнал, что это связано с тем, что тег <screenshots> помещается под углом.Если бы я удалил это <screenshots> вручную, это сработало бы.Есть ли способ сделать это программно?Или мой подход просто не хороший / неправильный?

project-template.component.html (часть карусели)

<div id="test" class="carousel slide" data-ride="carousel">
    <div class="carousel-inner">
      <template #screenshots></template>
    </div>
    <a class="carousel-control-prev" href="#test" 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="#test" role="button" data-slide="next">
      <span class="carousel-control-next-icon" aria-hidden="true"></span>
      <span class="sr-only">Next</span>
    </a>
</div>

project-template.component.ts (часть карусели)

import { Component, OnInit, ViewChild, ViewContainerRef, ComponentFactoryResolver, ComponentFactory, ComponentRef, Input, Output, EventEmitter } from '@angular/core';
import { Router } from '@angular/router';
import { ScreenshotsComponent } from './screenshots/screenshots.component';

@Component({
  selector: 'app-project-template',
  templateUrl: './project-template.component.html',
  styleUrls: ['./project-template.component.css']
})
export class ProjectTemplateComponent {

  @Input() screenshots: Array<Object>;
  @Output() output = new EventEmitter();


  @ViewChild("screenshots", { read: ViewContainerRef }) containerScreenshots;
  componentRefScreenshots: ComponentRef<ScreenshotsComponent>;

  constructor(private resolver: ComponentFactoryResolver) { }

  ngOnInit() {
    this.containerScreenshots.clear();

    for(let i = 1; i < this.screenshots[0]["count"] + 1; i++){
      const factory: ComponentFactory<ScreenshotsComponent> = this.resolver.resolveComponentFactory(ScreenshotsComponent);
      this.componentRefScreenshots = this.containerScreenshots.createComponent(factory);
      let put = this.componentRefScreenshots.instance
      put.output.subscribe(event => console.log(event));
      if(i == 1){
        put.ac = " active"
      }
      put.number = i
      put.project = this.screenshots[0]['project'] as string;
      put.projectType = this.screenshots[0]['project-type'] as string;
    }

  }

}

screenshots.component.html

<div class="carousel-item{{ac}}">
  <img class="d-block w-100 image" src="../assets/{{projectType}}/{{project}}/Screenshot-{{number}}.png" alt="{{number}} slide"
    style="max-width: 15%; max-height: 15%;">
</div>

screenshots.component.ts

import { Component, OnInit, Output, Input, EventEmitter } from '@angular/core';

@Component({
  selector: 'screenshots',
  templateUrl: './screenshots.component.html',
  styleUrls: ['./screenshots.component.css']
})
export class ScreenshotsComponent implements OnInit {

  @Input() projectType: string = "loading...";
  @Input() project: string = "loading...";
  @Input() number: number = -1;
  @Input() ac: string = "";
  @Output() output = new EventEmitter();

  constructor() { }

  ngOnInit() {

  }

}

результат:

<div _ngcontent-c1="" class="carousel slide" data-ride="carousel" id="test">
  <div _ngcontent-c1="" class="carousel-inner">
    <template _ngcontent-c1=""></template>
    <screenshots _nghost-c6="">
      <div _ngcontent-c6="" class="carousel-item active">
        <img _ngcontent-c6="" class="d-block w-100 image" style="max-width: 15%; max-height: 15%;" src="../assets/android-projects/school-diary/Screenshot-1.png"
          alt="1 slide">
      </div>
    </screenshots>
    <screenshots _nghost-c6="">
      <div _ngcontent-c6="" class="carousel-item">
        <img _ngcontent-c6="" class="d-block w-100 image" style="max-width: 15%; max-height: 15%;" src="../assets/android-projects/school-diary/Screenshot-2.png"
          alt="2 slide">
      </div>
    </screenshots>
    <screenshots _nghost-c6="">
      <div _ngcontent-c6="" class="carousel-item">
        <img _ngcontent-c6="" class="d-block w-100 image" style="max-width: 15%; max-height: 15%;" src="../assets/android-projects/school-diary/Screenshot-3.png"
          alt="3 slide">
      </div>
    </screenshots>
    <screenshots _nghost-c6="">
      <div _ngcontent-c6="" class="carousel-item">
        <img _ngcontent-c6="" class="d-block w-100 image" style="max-width: 15%; max-height: 15%;" src="../assets/android-projects/school-diary/Screenshot-4.png"
          alt="4 slide">
      </div>
    </screenshots>
    <screenshots _nghost-c6="">
      <div _ngcontent-c6="" class="carousel-item">
        <img _ngcontent-c6="" class="d-block w-100 image" style="max-width: 15%; max-height: 15%;" src="../assets/android-projects/school-diary/Screenshot-5.png"
          alt="5 slide">
      </div>
    </screenshots>
    <screenshots _nghost-c6="">
      <div _ngcontent-c6="" class="carousel-item">
        <img _ngcontent-c6="" class="d-block w-100 image" style="max-width: 15%; max-height: 15%;" src="../assets/android-projects/school-diary/Screenshot-6.png"
          alt="6 slide">
      </div>
    </screenshots>
    <screenshots _nghost-c6="">
      <div _ngcontent-c6="" class="carousel-item">
        <img _ngcontent-c6="" class="d-block w-100 image" style="max-width: 15%; max-height: 15%;" src="../assets/android-projects/school-diary/Screenshot-7.png"
          alt="7 slide">
      </div>
    </screenshots>
    <screenshots _nghost-c6="">
      <div _ngcontent-c6="" class="carousel-item">
        <img _ngcontent-c6="" class="d-block w-100 image" style="max-width: 15%; max-height: 15%;" src="../assets/android-projects/school-diary/Screenshot-8.png"
          alt="8 slide">
      </div>
    </screenshots>
  </div>
  <a _ngcontent-c1="" class="carousel-control-prev" data-slide="prev" href="#test" role="button">
    <span _ngcontent-c1="" aria-hidden="true" class="carousel-control-prev-icon"></span>
    <span _ngcontent-c1="" class="sr-only">Previous</span>
  </a>
  <a _ngcontent-c1="" class="carousel-control-next" data-slide="next" href="#test" role="button">
    <span _ngcontent-c1="" aria-hidden="true" class="carousel-control-next-icon"></span>
    <span _ngcontent-c1="" class="sr-only">Next</span>
  </a>
</div>

1 Ответ

0 голосов
/ 24 июня 2018

Мне кажется, что вы пытаетесь использовать bootstrap , а не ngx-bootstrap . Я думаю, что вам лучше использовать последний, он гораздо более приспособлен к угловому:)

Во-вторых, я не понимаю, почему вы пытаетесь форсировать процедуру создания компонента, используя «сложный» ComponentFactory и так далее. Есть ли причина для этого? Просто потому, что если нет, я бы лучше использовал пример Dynamic Slides из ngx-bootstrap docs:

https://valor -software.com / NGX-самозагрузка / # / # карусельных динамические гребни

Таким образом, в основном вам нужно иметь цикл for (ngFor) в файле шаблона, который генерирует слайды динамически, в зависимости от того, сколько данных слайдов у вас есть в ограниченном вводе. Тег carousel имеет свойство activeSlide, которое можно привязать в двух направлениях, так что вы можете легко управлять активностью нужного индекса слайда.

EDIT: Если единственная проблема состоит в том, как удалить тег переноса компонента screenshots, то вы можете сделать следующее:

  1. настройте компонент скриншотов, чтобы он тоже работал как директива:

вместо

selector: 'screenshots',

использование

selector: 'screenshots, [screenshots-directive]',
  1. использование

вместо

<div class="carousel-inner">
    <template #screenshots></template>
</div>

написать цикл for, как упоминалось ранее:

<div class="carousel-inner">
  <div class="carousel-item" *ngFor="let screenshot of screenshots; 
       let i = index" screenshots-directive [number]="i" [project]="screenshot.project">
  </div>
</div>

Обратите внимание, что я взял carousel-item div из компонента screenshots. Это необходимо, потому что цикл должен быть добавлен в HTML-тег. Обычно теги ng-template и ng-container можно использовать, когда вы хотите использовать цикл for, но вы не хотите, чтобы контейнер цикла for отображался. Однако, похоже, он не работает вместе с директивой, такой как screenshots-directive, я не знаю почему.

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