2016-03-15 80 views
1

我必须用ng-repeat创建猫头鹰滑块来制作幻灯片。当我用下拉菜单过滤数据时,我正面临一个问题,幻灯片中的值会更新,但滑块不是工作并打破UI.I已经创建了一个codepen这个issue.`角度js猫头鹰滑块数据过滤问题

<div ng-app="plunker" ng-controller="MainCtrl"> 
    <div class="container"> 
     <div class="row"> 
     <div class="col-md-12"> 
      <select ng-change="refreshData(selectedItem)" ng-model="selectedItem" ng-options="opt for opt in filterValues" > 
       <option value="" selected="selected">Select the filter</option> 
      </select> 
      <data-owl-carousel class="owl-carousel" data-options="{navigation: false, pagination: true, rewindNav : false,items:4,pagination : true, paginationNumbers: false}"> 
       <div owl-carousel-item="" ng-repeat="item in filterData" class="items" data-owl-carousel> 
        <img src="{{item.src}}"/> 
        <h4 class="text-center">{{item.category}}</h4> 
       </div> 
      </data-owl-carousel> 
     </div> 
     </div> 
    </div> 
</div> 

这里是 Codepen参考网址

+0

没有我的回答解决这个问题?如果是,请考虑将其标记为“已接受”,如果不是,请对其进行评论并解释其中的错误。 –

+0

对于迟到的回复感到抱歉。您的答案解决了这个问题,非常感谢 –

回答

1

这里的问题是,owlCarousel包装了一部开拓创新的物品放入额外的div中, HTML看起来像这样:

<data-owl-carousel class="owl-carousel owl-theme" data-options="..."> 
     <!-- ngRepeat: item in filterData --> 
     <div class="owl-wrapper-outer"> 
      <div class="owl-wrapper" style="width: 4320px; left: 0px; display: block;"> 
       <div class="owl-item" style="width: 240px;"> 
        <div owl-carousel-item="" ng-repeat="item in filterData" class="items ng-scope" data-owl-carousel=""> 
        <img src="http://compareindia.ibnlive.com/media/gallery/images/2012/jul/beam_1_031058257405.jpg"> 
        <h4 class="text-center ng-binding">samsung</h4> 
        </div> 
       </div> 
       <div class="owl-item" style="width: 240px;"> 
        <div owl-carousel-item="" ng-repeat="item in filterData" class="items ng-scope" data-owl-carousel=""> 
        <img src="http://www.india777.com/company_prof/11-07-2012-05-32-58-samsung-mobile-GT-S6802.jpg"> 
        <h4 class="text-center ng-binding">samsung</h4> 
        </div> 
       </div> 
       ... 

您可以看到,使用.owl-carousel-item类的原始div包含在其他.owl-item div中。

一旦你筛选数据,角去除NG-重复的div并插入新的,但它一无所知包装,所以HTML变成这样:

<data-owl-carousel class="owl-carousel owl-theme" data-options="..."> 
    <!-- ngRepeat: item in filterData --> 
    <div owl-carousel-item="" ng-repeat="item in filterData" class="items ng-scope" data-owl-carousel=""> 
     <img src="http://compareindia.ibnlive.com/media/gallery/images/2012/jul/beam_1_031058257405.jpg"> 
     <h4 class="text-center ng-binding">samsung</h4> 
    </div> 
    <div class="owl-wrapper-outer"> 
     <div class="owl-wrapper" style="width: 5706px; left: 0px; display: block; transition: all 0ms ease; transform: translate3d(0px, 0px, 0px);"> 
      <div class="owl-item" style="width: 317px;"></div> 
      <div class="owl-item" style="width: 317px;"></div> 
      ... 

这里在顶部有一个新的(过滤)数据,然后是空的owlCarousel的包装。

解决方案(代码如下)是在过滤数据时销毁/重新创建owlCarousel。 其他解决方案可以修改owlCarousel代码,使其不使用包装div或切换到其他更友好的旋转木马。

无论如何,这里是工作代码:

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

 
app.controller('MainCtrl', function($scope,$rootScope,$filter,$timeout) { 
 
    //$scope.items2 = [1,2,3,4,5,6,7,8,9,10]; 
 
    $scope.carouselData =[ 
 
{"category":"samsung","src":"http://compareindia.ibnlive.com/media/gallery/images/2012/jul/beam_1_031058257405.jpg"}, 
 
{"category":"samsung","src":"http://www.india777.com/company_prof/11-07-2012-05-32-58-samsung-mobile-GT-S6802.jpg"}, 
 
{"category":"apple","src":"http://androidos.in/wp-content/uploads/2011/12/Galaxy-S-II-T_Mobile.jpg"}, 
 
{"category":"apple","src":"http://www.pakmobileprice.com/wp-content/uploads/2015/03/Samsung-Galaxy-S6-EDGE.jpg"}, 
 

 
{"category":"apple","src":"http://www.pakmobileprice.com/wp-content/uploads/2015/03/Samsung-Galaxy-S6-EDGE.jpg"}, 
 

 
{"category":"apple","src":"http://www.pakmobileprice.com/wp-content/uploads/2015/03/Samsung-Galaxy-S6-EDGE.jpg"}, 
 

 
{"category":"apple","src":"http://www.pakmobileprice.com/wp-content/uploads/2015/03/Samsung-Galaxy-S6-EDGE.jpg"}, 
 

 
{"category":"samsung","src":"http://compareindia.ibnlive.com/media/gallery/images/2012/jul/beam_1_031058257405.jpg"}, 
 
{"category":"samsung","src":"http://www.india777.com/company_prof/11-07-2012-05-32-58-samsung-mobile-GT-S6802.jpg"} 
 

 
]; 
 
$scope.filterValues = ['samsung','apple']; 
 

 
$scope.refreshData = function(val){ 
 
    $scope.filterData = []; 
 
    // notify the carousel about data change 
 
    $rootScope.$broadcast('owlCarousel.changeStart'); 
 
    $timeout(function(){ 
 
     if (!val) val = ''; 
 
     $scope.filterData = $filter('filter')($scope.carouselData, {category: val}); 
 
     console.log($scope.filterData); 
 
     // notify the carousel that data is changed 
 
     $rootScope.$broadcast('owlCarousel.changeEnd'); 
 
    }); 
 
} 
 
$scope.refreshData(''); 
 
}).directive("owlCarousel", function($timeout) { 
 
    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); 
 
       
 
       // Event to remove the carousel on data change start 
 
       scope.$on('owlCarousel.changeStart', function(data) { 
 
        console.log('owlCarousel.destroy'); 
 
        var data = $(element).data('owlCarousel'); 
 
        if (data) data.destroy();      
 
       }); 
 
       // Event to create the carousel back when data change is completed 
 
       scope.$on('owlCarousel.changeEnd', function(data) { 
 
        $timeout(function() { 
 
         console.log('owlCarousel.create '); 
 
         $(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()); 
 
      } 
 
     } 
 
    }; 
 
}]); 
 

 

 
      
.items img 
 
{ 
 
    max-width:100%; 
 
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/owl-carousel/1.3.3/owl.carousel.min.css" /> 
 
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/owl-carousel/1.3.3/owl.theme.min.css" /> 
 
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/owl-carousel/1.3.3/owl.transitions.min.css" /> 
 
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/owl-carousel/1.3.3/owl.carousel.min.js" /> 
 
    <script data-require="[email protected]" src="https://code.angularjs.org/1.3.15/angular.js" data-semver="1.3.15"></script> 
 
    <script data-require="[email protected]" data-semver="2.1.3" src="http://code.jquery.com/jquery-2.1.3.min.js"></script> 
 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/owl-carousel/1.3.3/owl.carousel.min.js"></script> 
 

 
<div ng-app="plunker" ng-controller="MainCtrl"> 
 
<div class="container"> 
 
    <div class="row"> 
 
    <div class="col-md-12"> 
 

 

 
<select ng-change="refreshData(selectedItem)" ng-model="selectedItem" ng-options="opt for opt in filterValues" > 
 
    <option value="" selected="selected">Select the filter</option> 
 
             
 
     </select> 
 
     
 

 
    <data-owl-carousel class="owl-carousel" data-options="{navigation: false, pagination: true, rewindNav : false,items:4,pagination : true, paginationNumbers: false}"> 
 
     <div owl-carousel-item="" ng-repeat="item in filterData" class="items" data-owl-carousel> 
 
     <img src="{{item.src}}"/> 
 
     <h4 class="text-center">{{item.category}}</h4> 
 
      </div> 
 
    </data-owl-carousel> 
 
</div></div></div></div>

+0

您还可以使用以下命令破坏传送带: ''$(element).owlCarousel('destroy');'' –