3

loopオプションを に設定してフクロウのカルーセルをレンダリングするディレクティブがありますtrue。カルーセル内の各アイテムはng-clickイベントにリンクされています。ただし、loopオプションがであるtrueため、カルーセルは各アイテムをカルーセルに複製して、ループの錯覚を与えます。これらの複製されたアイテムは、コントローラ スコープにアタッチされていません。

これは私が使用しているものです

js

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope) {
  $scope.items1 = [1,2,3,4,5];
  $scope.items2 = [1,2,3,4,5,6,7,8,9,10];
  $scope.a = function(i){
    alert(i);
  }
}).directive("owlCarousel", function() {
    return {
        restrict: 'E',
        transclude: false,
        link: function (scope) {
            scope.initCarousel = function(element) {
              // provide any default options you want
                var defaultOptions = {
                };
                var customOptions = scope.$eval($(element).attr('data-options'));
                // combine the two options objects
                for(var key in customOptions) {
                    defaultOptions[key] = customOptions[key];
                }
                // init carousel
                $(element).owlCarousel(defaultOptions);
            };
        }
    };
})
.directive('owlCarouselItem', [function() {
    return {
        restrict: 'A',
        transclude: false,
        link: function(scope, element) {
          // wait for the last item in the ng-repeat then call init
            if(scope.$last) {
                scope.initCarousel(element.parent());
            }
        }
    };
}]);

html

<body ng-controller="MainCtrl">
    <data-owl-carousel class="owl-carousel" data-options="{loop:true}">
      <div owl-carousel-item="" ng-repeat="item in ::items1" class="item">
        <a ng-click="a($index)">{{::item}}</a>
      </div>
    </data-owl-carousel>
  </body>

これはコード付きのプランカーです

新しいクローン アイテムにスコープを再レンダリングまたはリンクするにはどうすればよいですか?

4

1 に答える 1

1

機能する唯一の方法は、scope.initCarousel 関数内で $timeout を使用することでした。私は最善の解決策ではないことを知っています。

ここにプランカーが固定されています

.directive("owlCarousel", ['$timeout',function($timeout) {
return {
    restrict: 'E',
    transclude: false,
    link: function (scope) {
        scope.initCarousel = function(element) {
           $timeout(function () {
              // provide any default options you want
                var defaultOptions = {
                };
                var customOptions = scope.$eval($(element).attr('data-options'));
                // combine the two options objects
                for(var key in customOptions) {
                    defaultOptions[key] = customOptions[key];
                }
                // init carousel
                $(element).owlCarousel(defaultOptions);
           },50);
    };
    }
};

}])

于 2016-06-04T03:11:59.560 に答える