@beta-it

Как подружить owl-carousel и Angular 2?

Суть такая пытаюсь вывести результат GET запроса в owl-carousel.

Библиотеку с Angular я подружил и тестовый пример в шаблоне компонента работает:

Ниже код (шаблон):
<div class="owl-carousel owl-theme">
            <div class="item">
                <h4>1</h4>
            </div>
            <div class="item">
                <h4>2</h4>
            </div>
            <div class="item">
                <h4>3</h4>
            </div>
            <div class="item">
                <h4>4</h4>
            </div>
            <div class="item">
                <h4>5</h4>
            </div>
        </div>


Код компонента:
ngAfterViewInit() {
        $(document).ready(function () {
            $('.owl-carousel').owlCarousel({
                loop: true,
                margin: 10,
                responsiveClass: true,
                autoWidth: false,
                navText: ["Предыдущий", "Следующий"],
                responsive: {
                    0: {
                        items: 1,
                        nav: true
                    },
                    600: {
                        items: 3,
                        nav: false
                    },
                    1000: {
                        items: 5,
                        nav: true,
                        loop: false,
                        margin: 20
                    }
                }
            });
        });
    }


А вот этот код ну ни как не хочет работать:
<div class="owl-carousel owl-theme">
            <div class="item" *ngFor="let t of test">
                <h4>{{t.name}}</h4>
            </div>
        </div>
  • Вопрос задан
  • 1166 просмотров
Решения вопроса 2
@beta-it Автор вопроса
В общем решение такое:
Создаем служебную директиву:
import {Directive, Input} from '@angular/core';

@Directive({
    selector: '[scroll]'
})
export class ScrollDirective {

    constructor() {
    }

    @Input('scroll')
    set appScroll(isReady: boolean) {
        if (isReady)
            this.ngForCallback();
    }

    ngForCallback() {
        $('.owl-carousel').owlCarousel({
            loop: true,
            margin: 10,
            responsiveClass: true,
            autoWidth: false,
            navText: ["Предыдущий", "Следующий"],
            responsive: {
                0: {
                    items: 1,
                    nav: true
                },
                600: {
                    items: 3,
                    nav: false
                },
                1000: {
                    items: 5,
                    nav: true,
                    loop: false,
                    margin: 20
                }
            }
        });

        console.log('run');
    }
}


И в шаблоне:
.....
<div class="owl-carousel owl-theme">
    <div class="item" *ngFor="let t of test; let l=last" [scroll]="l ? true : false">
        <h4>{{t?.name}}</h4>
    </div>
</div>
.....


Судя по консоли ( console.log('run') ) срабатывает всего один раз...
Ответ написан
Комментировать
Инициировать карусель, то есть делать вот это:
$('.owl-carousel').owlCarousel({
....
}))

необходимо где-то в каллбэке.
У вас получается следующая очередность событий:
1 . GET-запрос
2. ngAfterViewInit() - тут вы ждете события готовности DOM и инициируете карусель
3. Возвращаются данные
4. Отрабатывает цикл *ngFor и создаются элементы (карусель о них ничего уже не узнает)

А вам нужно, чтобы карусель инициировалась после того, как данные будут получены и *ngFor отработает.
Вот пример как сделать каллбэк на *ngFor:
<li *ngFor="let item in Items; let last = last">
  ...
  <span *ngIf="last">{{ngForCallback()}}</span>
</li>

public ngForCallback() {
  ...
}

Пример взят отсюда
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы