Подтвердить что ты не робот

Карусель Bootstrap не работает с angularjs

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

Мой пример кода выглядит следующим образом. (Примечание: этот код работает только с Bootstrap 3.1.0, но не с AngularJS 1.2.13)

<div id="Carousel" class="carousel slide">
    <ol class="carousel-indicators">
        <li data-target="Carousel" data-slide-to="0" class="active"></li>
        <li data-target="Carousel" data-slide-to="1"></li>
        <li data-target="Carousel" data-slide-to="2"></li>
    </ol>
    <div class="carousel-inner">
        <div class="item active">
            <img src="images/c.png" class="img-responsive">
        </div>
        <div class="item">
            <img src="images/b.png" class="img-responsive">
        </div>
        <div class="item">
            <img src="images/a.png" class="img-responsive">
        </div>
    </div>
    <a class="left carousel-control" href="#Carousel" data-slide="prev">
        <span class="glyphicon glyphicon-chevron-left"></span>
    </a>
    <a class="right carousel-control" href="#Carousel" data-slide="next">
       <span class="glyphicon glyphicon-chevron-right"></span>
    </a>
</div>
4b9b3361

Ответ 1

Основываясь на том, что сказал rbanning, вместо добавления обработчика событий вы можете просто после замены меток привязки тегами span заменить атрибут href атрибутом "data-target", а bootstrap заботится об остальном.

Так же:

<div id="Carousel" class="carousel slide">
<ol class="carousel-indicators">
    <li data-target="Carousel" data-slide-to="0" class="active"></li>
    <li data-target="Carousel" data-slide-to="1"></li>
    <li data-target="Carousel" data-slide-to="2"></li>
</ol>
<div class="carousel-inner">
    <div class="item active">
        <img src="images/c.png" class="img-responsive">
    </div>
    <div class="item">
        <img src="images/b.png" class="img-responsive">
    </div>
    <div class="item">
        <img src="images/a.png" class="img-responsive">
    </div>
</div>
<span class="left carousel-control" data-target="#Carousel" data-slide="prev">
    <span class="glyphicon glyphicon-chevron-left"></span>
</span>
<span class="right carousel-control" data-target="#Carousel" data-slide="next">
   <span class="glyphicon glyphicon-chevron-right"></span>
</span>
</div>

Ответ 2

Как уже упоминалось, проблема заключается в том, что AngularJS и ngRoute перехватывают клики a-link. У меня была эта проблема, но я не хотел использовать Angular UI Bootstrap (как описано в других ответах).

Итак, я изменил элементы управления .carousel из ссылок (теги a) на промежутки.

<span class="left carousel-control" data-slide="prev">
    <span class="glyphicon glyphicon-chevron-left"></span>
</span>
<span class="right carousel-control" data-slide="next">
    <span class="glyphicon glyphicon-chevron-right"></span>
</span>

Затем я добавил обработчик событий следующим образом:

  $('.carousel').carousel({
                interval: 5000,
                pause: "hover",
                wrap: true
            })
            .on('click', '.carousel-control', handle_nav);

  var handle_nav = function(e) {
        e.preventDefault();
        var nav = $(this);
        nav.parents('.carousel').carousel(nav.data('slide'));
  }

Надеюсь, что это поможет...

Ответ 3

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

<div ng-non-bindable>
    <div id="Carousel" class="carousel slide">
        <!-- carousel content -->
    </div>
</div>

Ответ 4

Задайте target="_self" в настройках карусели:

<a class="left carousel-control" href="#Carousel" data-slide="prev" target="_self">

Ответ 5

Вы также можете использовать ng-click для обоих элементов управления.

Я использую это на своем сайте (примечание href="" сейчас пустое)

В поле зрения:

    <a class="left carousel-control" href="" ng-click="slide('prev')" role="button" data-slide="prev">
        <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
    </a>
    <a class="right carousel-control" ng-click="slide('next')" role="button" data-slide="next">
        <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
    </a>

В контроллере:

$scope.slide = function (dir) {
    $('#carouselId').carousel(dir);
};

Ответ 7

Почему бы не использовать пользовательский интерфейс Angular, чтобы заставить Bootstrap и Angular играть хорошо?

http://angular-ui.github.io/bootstrap/#/carousel

EDIT:

Ваш код не работает, потому что на навигационных ссылках у вас есть атрибуты href, установленные в #Carousel. Поэтому, когда вы нажимаете на эти ссылки Angular, маршрутизатор будет пытаться изменить представление и отобразить тот, который называется Carousel, который не определен в вашем маршруте $routeProvider, поэтому пустая страница.

Поскольку вы используете Bootstrap.js, кажется, что вам абсолютно нужны эти атрибуты href, поэтому, возможно, вы избавитесь от маршрутизатора. Или попробуйте Angular UI;)

Ответ 8

Это работает, не изменяя исходный пример начальной загрузки

$("a.carousel-control").click(function(e){
    e.preventDefault();
    $(this).parent().carousel($(this).data("slide"));
});

Ответ 9

Вы можете сделать функцию и поместить ее в предыдущую/следующую стрелку в html.

$scope.prevSlide = function() {
    $('#MY-CAROUSEL-ID').carousel('prev');
};