0

试图理解为什么它不起作用。

我有这样的东西。

<div class="carousel slide" id="new-prospect-container">
   <div class="carousel-inner">
   {{#each model}}
      <div class="item">
      ...
     </div>
   {{/each}}
   </div>
</div>

但是 Botostrap 的第一类 api 意味着我们不需要执行任何 JS 方法,它们的小部件会自动工作。问题是我怀疑 Bootstrap 会在我的 {{model}} 被 Ajax 请求填满之前执行此操作。所以这个旋转木马不起作用。

烦人的是我已经尝试关闭他们的 data-api - $(document).off('.data-api'); 并手动调用他们的轮播方法 - 仍然无法正常工作。

轮播使用硬编码数据 - 但是一旦我尝试从我的 Ember 模型中填充轮播 div 项,它就会停止工作。

  1. 任何想法?
  2. 为什么会存在 - https://github.com/emberjs-addons/ember-bootstrap?是否存在在这里完全解决我的问题?(虽然没有轮播)
4

3 回答 3

9

1 - 我希望这个 jsfiddle 能解决你的问题。

App.CarouselView = Ember.View.extend({    
    templateName: 'carousel',
    classNames: ['carousel', 'slide'],
    init: function() { 
        this._super.apply(this, arguments);
        // disable the data api from boostrap
        $(document).off('.data-api');      
        // at least one item must have the active class, so we set the first here, and the class will be added by class binding
        var obj = this.get('content.firstObject');
        Ember.set(obj, 'isActive', true);
    },
    previousSlide: function() {
        this.$().carousel('prev');
    },
    nextSlide: function() {
        this.$().carousel('next');
    },
    didInsertElement: function() {
        this.$().carousel();
    },
    indicatorsView: Ember.CollectionView.extend({
        tagName: 'ol',
        classNames: ['carousel-indicators'],        
        contentBinding: 'parentView.content',
        itemViewClass: Ember.View.extend({
            click: function() {
                var $elem = this.get("parentView.parentView").$();
                $elem.carousel(this.get("contentIndex"));
            },
            template: Ember.Handlebars.compile(''),
            classNameBindings: ['content.isActive:active']            
        })
    }),
    itemsView: Ember.CollectionView.extend({        
        classNames: ['carousel-inner'],
        contentBinding: 'parentView.content',
        itemViewClass: Ember.View.extend({
            classNames: ['item'],
            classNameBindings: ['content.isActive:active'],
            template: Ember.Handlebars.compile('\
                <img {{bindAttr src="view.content.image"}} alt=""/>\
                <div class="carousel-caption">\
                    <h4>{{view.content.title}}</h4>\
                    <p>{{view.content.content}}</p>\
                </div>')
        })
    })
});

2 - 我不知道为什么旋转木马不包含在 ember-boostrap 中。

于 2013-08-06T01:21:12.903 回答
4

所以我有一个解决方案,但它不适合娇气。

对于 Carousel,Bootstrap 没有足够具体地说明它要查找的元素。当 carousel 函数清点要操作的元素时,它会阻塞 Ember 注入 DOM 的 metamorph 标签。基本上,当它查看有多少图像时,它总是会发现比实际数量多 2 个。

我在引导库中对轮播的底层代码进行了更改,这就是我所做的。

Line 337, change:
this.$items  = this.$active.parent().children()
TO
this.$items  = this.$active.parent().children('.item')


Line 379, change:
var $next     = next || $active[type]()
TO
var $next     = next || $active[type]('.item')


Line 401, change:
var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
TO
var $nextIndicator = $(that.$indicators.children('li')[that.getActiveIndex()])

这有助于 carousel 插件忽略 metamorph 标签。

希望这可以帮助。

于 2013-12-12T19:01:39.630 回答
3

我有同样的问题并通过使用以下方法解决了它。请注意,我使用的是 ember-cli,但它很容易适应。

这是templates/components/photo-carousel.hbs文件:

<div id="my-carousel" class="carousel slide" data-ride="carousel">

    <ol class="carousel-indicators">
        {{#each photo in photos}}
            <li data-target="#my-carousel" data-slide-to=""></li>
        {{/each}}
    </ol>

    <div class="carousel-inner" role="listbox">
        {{#each photo in photos}}
            <div class="item">
                <img {{bind-attr src="photo.completeUrl" title="photo.caption" alt="photo.caption"}} />
                <div class="carousel-caption">
                    {{photo.caption}}
                </div>
            </div>
        {{/each}}
    </div>

    <!-- removed right and left controls for clarity -->
</div>

这是components/photo-carousel.js

export default Ember.Component.extend({
    didInsertElement: function () {

        // Add the active classes (required by the carousel to work)
        Ember.$('.carousel-inner div.item').first().addClass('active');
        Ember.$('.carousel-indicators li').first().addClass('active');

        // Set the values of data-slide-to attributes
        Ember.$('.carousel-indicators li').each(function (index, li) {
            Ember.$(li).attr('data-slide-to', index);
        });

        // Start the carousel
        Ember.$('.carousel').carousel();
    }
});

请注意,active未来版本的 Ember 将不需要手动设置类,因为each助手将提供index当前项目的。

于 2015-04-18T21:23:24.407 回答