将 angularjs ng-repeat 应用于 owl-carousel
Applying angularjs ng-repeat to owl-carousel
<div class="owl-carousel">
<div ng-repeat="items in itemlist">
<a href="series.html"><img ng-src="{{items.imageUrl}}" /></a>
</div>
<div>
<a href="series.html"><img src="http://placehold.it/350x150" /></a>
</div>
</div>
在此处查看轮播:Owl-carousel2
我 运行 遇到一个问题,每当将 ng-repeat 指令应用于轮播时,项目都会垂直堆叠而不是水平布局。
如果我省略 ng-repeat 并使用静态项,那么它会正常工作。
是否有我可以编写并应用于 owl-carousel 以保持布局的指令?
此外,导致轮播中断的 ng-repeat 是怎么回事?
angular 是否以某种方式剥离 owl-轮播 类 应用于轮播?
注意* 如果手动构建列表,则循环访问并附加元素:
var div = document.createElement('div');
var anchor = document.createElement('a');
var img = document.createElement('img');
.....
carousel.appendChild(div);
然后调用 owl.owlCarousel({..}) 它有效,不确定这是否是最好的解决方法,因为 ng-repeat 让一切变得更容易。
我发现了一个 hack,如果我在超时中包装 owl init,那么 ng-repat 就可以工作。
setTimeout(function(){
...call owl init now
},1000);
<link rel="stylesheet" href="css/owl.carousel.css"/>
<link rel="stylesheet" href="css/owl.theme.default.min.css"/>
.....
<script src="/js/lib/owl.carousel.min.js"></script>
<script>
$(document).ready(function() {
var owl = $('.owl-carousel');
owl.owlCarousel({
.....
});
owl.on('mousewheel', '.owl-stage', function(e) {
if (e.deltaY > 0) {
owl.trigger('next.owl');
} else {
owl.trigger('prev.owl');
}
e.preventDefault();
});
})
</script>
Angular UI 团队将一组 bootstrap 组件组合在一起作为 angular 指令实现。它们超级流畅且实施起来很快,而且因为它们是指令,所以您不会 运行 遇到在 angular 项目中使用 jquery 的问题。其中一个指令是轮播。你可以找到它 here and here。我用 angular 摆弄了很长时间的轮播。经过一些烦人的修补后,我让 owl 开始工作,但是 AngularUI 的实现 更 容易。
我试着摆弄不同的指令,但直到我发现这个时才走运,它可能有点 hack 修复,但它仍然有效。
这是我的 div 设置:
<div ng-repeat="item in mediaitems">
<img ng-src="item.imageurl" />
</div>
$scope.mediaitems 是使用 ajax 调用生成的。我发现如果我延迟 owl 初始化直到我的列表被填充,那么它会正确呈现它。此外,如果您决定要更新动态列表,只需在填充列表后调用 setupcarousel 函数(见下文),它将重新初始化轮播。
请注意,carousel init 位于匿名函数内的外部文件中。这就是我选择设置它的方式,您可以在线使用您的设置,也可以随心所欲。
在我的控制器中,我有这样的东西:
$scope.populate = function(){
$timeout(function(){
$scope.mediaitems = returnedlist; //list of items retrun from server
utils.setupcarousel(); //call owl initialization
});
};
var utils = (function(){
var setupcarousel = function(){
console.log('setting up carousel..');
var owl = $('.owl-carousel');
if(typeof owl.data('owlCarousel') != 'undefined'){
owl.data('owlCarousel').destroy();
owl.removeClass('owl-carousel');
}
owl.owlCarousel({
loop: false,
nav: true,
margin: 10,
responsive: {
0: {items: 3 },
600: {items: 5},
960: { items: 8},
1200:{items: 10},
1600:{items: 12}
}
});
};
return{
....
}
})();
能够修改来自 DTing on another to get it working with multiple carousels on the same page. Here is a working plnkr
的指令
-- 编辑 --
还有一个plnkr来举例说明如何添加一个项目。执行 reinit() 不起作用,因为任何时候 owl 传送带被破坏都会丢失数据元素并且永远无法再次初始化。
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];
}).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
<!DOCTYPE html>
<html ng-app="plunker">
<head>
<meta charset="utf-8" />
<title>AngularJS Plunker</title>
<script>document.write('<base href="' + document.location + '" />');</script>
<link rel="stylesheet" href="style.css" />
<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="angular.js@1.3.x" src="https://code.angularjs.org/1.3.15/angular.js" data-semver="1.3.15"></script>
<script data-require="jquery@2.1.3" 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>
<script src="app.js"></script>
</head>
<body ng-controller="MainCtrl">
<data-owl-carousel class="owl-carousel" data-options="{navigation: true, pagination: false, rewindNav : false}">
<div owl-carousel-item="" ng-repeat="item in ::items1" class="item">
<p>{{::item}}</p>
</div>
</data-owl-carousel>
<data-owl-carousel class="owl-carousel" data-options="{navigation: false, pagination: true, rewindNav : false}">
<div owl-carousel-item="" ng-repeat="item in ::items2" class="item">
<p>{{::item}}</p>
</div>
</data-owl-carousel>
</body>
</html>
这与 JKOlaf 提到的答案相同。但是,我为其添加了响应行为,以提供更好的用户体验。
2 大改进:
1. 完全响应式代码在不同设备上带来更好的用户体验。
2. 现在处理 "autoHeight" 属性,导致图像缩略图变小。
代码如下:
Was able to modify a directive from DTing on another post to get it working with multiple carousels on the same page. Here is a working plnkr
-- Edit -- Have another plnkr to give an example on how to add an item. Doing a reinit() did not work cause any time the owl carousel is destroyed it loses the data- elements and can never initialize again.
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];
}).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];
}
defaultOptions['responsive'] = {
0: {
items: 1
},
600: {
items: 3
},
1000: {
items: 6
}
};
// 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());
}
}
};
}]);
您可以根据需要更改响应项目数。将其设置为较小的值以获得较大的图像缩略图。
希望这会对某人有所帮助,并感谢原始答案提供者。
<div class="owl-carousel">
<div ng-repeat="items in itemlist">
<a href="series.html"><img ng-src="{{items.imageUrl}}" /></a>
</div>
<div>
<a href="series.html"><img src="http://placehold.it/350x150" /></a>
</div>
</div>
在此处查看轮播:Owl-carousel2
我 运行 遇到一个问题,每当将 ng-repeat 指令应用于轮播时,项目都会垂直堆叠而不是水平布局。
如果我省略 ng-repeat 并使用静态项,那么它会正常工作。
是否有我可以编写并应用于 owl-carousel 以保持布局的指令?
此外,导致轮播中断的 ng-repeat 是怎么回事?
angular 是否以某种方式剥离 owl-轮播 类 应用于轮播?
注意* 如果手动构建列表,则循环访问并附加元素:
var div = document.createElement('div');
var anchor = document.createElement('a');
var img = document.createElement('img');
.....
carousel.appendChild(div);
然后调用 owl.owlCarousel({..}) 它有效,不确定这是否是最好的解决方法,因为 ng-repeat 让一切变得更容易。
我发现了一个 hack,如果我在超时中包装 owl init,那么 ng-repat 就可以工作。
setTimeout(function(){
...call owl init now
},1000);
<link rel="stylesheet" href="css/owl.carousel.css"/>
<link rel="stylesheet" href="css/owl.theme.default.min.css"/>
.....
<script src="/js/lib/owl.carousel.min.js"></script>
<script>
$(document).ready(function() {
var owl = $('.owl-carousel');
owl.owlCarousel({
.....
});
owl.on('mousewheel', '.owl-stage', function(e) {
if (e.deltaY > 0) {
owl.trigger('next.owl');
} else {
owl.trigger('prev.owl');
}
e.preventDefault();
});
})
</script>
Angular UI 团队将一组 bootstrap 组件组合在一起作为 angular 指令实现。它们超级流畅且实施起来很快,而且因为它们是指令,所以您不会 运行 遇到在 angular 项目中使用 jquery 的问题。其中一个指令是轮播。你可以找到它 here and here。我用 angular 摆弄了很长时间的轮播。经过一些烦人的修补后,我让 owl 开始工作,但是 AngularUI 的实现 更 容易。
我试着摆弄不同的指令,但直到我发现这个时才走运,它可能有点 hack 修复,但它仍然有效。
这是我的 div 设置:
<div ng-repeat="item in mediaitems">
<img ng-src="item.imageurl" />
</div>
$scope.mediaitems 是使用 ajax 调用生成的。我发现如果我延迟 owl 初始化直到我的列表被填充,那么它会正确呈现它。此外,如果您决定要更新动态列表,只需在填充列表后调用 setupcarousel 函数(见下文),它将重新初始化轮播。
请注意,carousel init 位于匿名函数内的外部文件中。这就是我选择设置它的方式,您可以在线使用您的设置,也可以随心所欲。
在我的控制器中,我有这样的东西:
$scope.populate = function(){
$timeout(function(){
$scope.mediaitems = returnedlist; //list of items retrun from server
utils.setupcarousel(); //call owl initialization
});
};
var utils = (function(){
var setupcarousel = function(){
console.log('setting up carousel..');
var owl = $('.owl-carousel');
if(typeof owl.data('owlCarousel') != 'undefined'){
owl.data('owlCarousel').destroy();
owl.removeClass('owl-carousel');
}
owl.owlCarousel({
loop: false,
nav: true,
margin: 10,
responsive: {
0: {items: 3 },
600: {items: 5},
960: { items: 8},
1200:{items: 10},
1600:{items: 12}
}
});
};
return{
....
}
})();
能够修改来自 DTing on another
-- 编辑 -- 还有一个plnkr来举例说明如何添加一个项目。执行 reinit() 不起作用,因为任何时候 owl 传送带被破坏都会丢失数据元素并且永远无法再次初始化。
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];
}).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
<!DOCTYPE html>
<html ng-app="plunker">
<head>
<meta charset="utf-8" />
<title>AngularJS Plunker</title>
<script>document.write('<base href="' + document.location + '" />');</script>
<link rel="stylesheet" href="style.css" />
<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="angular.js@1.3.x" src="https://code.angularjs.org/1.3.15/angular.js" data-semver="1.3.15"></script>
<script data-require="jquery@2.1.3" 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>
<script src="app.js"></script>
</head>
<body ng-controller="MainCtrl">
<data-owl-carousel class="owl-carousel" data-options="{navigation: true, pagination: false, rewindNav : false}">
<div owl-carousel-item="" ng-repeat="item in ::items1" class="item">
<p>{{::item}}</p>
</div>
</data-owl-carousel>
<data-owl-carousel class="owl-carousel" data-options="{navigation: false, pagination: true, rewindNav : false}">
<div owl-carousel-item="" ng-repeat="item in ::items2" class="item">
<p>{{::item}}</p>
</div>
</data-owl-carousel>
</body>
</html>
这与 JKOlaf 提到的答案相同。但是,我为其添加了响应行为,以提供更好的用户体验。 2 大改进: 1. 完全响应式代码在不同设备上带来更好的用户体验。 2. 现在处理 "autoHeight" 属性,导致图像缩略图变小。
代码如下:
Was able to modify a directive from DTing on another post to get it working with multiple carousels on the same page. Here is a working plnkr
-- Edit -- Have another plnkr to give an example on how to add an item. Doing a reinit() did not work cause any time the owl carousel is destroyed it loses the data- elements and can never initialize again.
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];
}).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];
}
defaultOptions['responsive'] = {
0: {
items: 1
},
600: {
items: 3
},
1000: {
items: 6
}
};
// 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());
}
}
};
}]);
您可以根据需要更改响应项目数。将其设置为较小的值以获得较大的图像缩略图。 希望这会对某人有所帮助,并感谢原始答案提供者。