我想要做的是使用 ng-repeat 指令有角度地构建我的轮播结构,然后将其提供给 owl carousel jquery 插件。部分技巧是这个轮播带有一个视图(ngView)。
可悲的是,这似乎并不那么简单。
到目前为止,我探索的选项是:
$viewContentLoaded
事件。这不起作用,并且显然是不赞成的(因为它相当于来自控制器的 DOM 操作)- 只需在视图页面底部包含一些脚本来初始化轮播插件。这适用于静态内容,但不适用于通过 ng-repeat 添加的内容
- 添加自定义指令。好的,这可行,但这似乎意味着我必须自己建立整个旋转木马。很好地使用 jQuery.append() 等。下面的代码如下。
基本上我的问题是:是否有其他/更好的方法来做到这一点(而不是无限循环和 HTML 字符串连接)?
请注意,我需要构建的真正轮播项目比下面的示例要复杂得多。
好的,现在一些代码:
首先,来自相关视图的 HTML 片段:
<div class="owl-carousel owl-theme daCarousel" da-carousel="">
</div>
接下来,指令配置:
app.directive('daCarousel',function () {
var makeItLive = function (scope, element, attrs)
{
//TODO feed in real data here
for (var i = 0; i < 10; i++) {
$(element).append ('<div class="item">Item ' + i + '</div>');
}
$(element).owlCarousel({
navigation : true, // Show next and prev buttons
slideSpeed : 300,
paginationSpeed : 400,
singleItem:true
});
};
编辑
好的,与此同时,我发现了该$templateCache
服务。
本质上在脚本标签中定义一个模板(我的实际上是在相关视图中):
<script type="text/ng-template" id="specialsTemplate.html">
//HTML with AngularJS bindings etc here
</script>
然后你可以在你的指令中得到这样的:
var tpl = $templateCache.get('specialsTemplate.html') ;
var compiled = $compile(tpl)(scope);
element.html (compiled);
对于最后一点魔法,使用 Oakfish 的建议$timeout
:
$timeout (
function () {
$('#correctIdForYourCarouselElement').owlCarousel({
navigation : false, // Show next and prev buttons
slideSpeed : 300,
paginationSpeed : 400,
singleItem:true
// "singleItem:true" is a shortcut for:
// items : 1,
// itemsDesktop : false,
// itemsDesktopSmall : false,
// itemsTablet: false,
// itemsMobile : false
});
},
50
);