2015-03-30 29 views
1

我在Backbone.js之上使用Marionette,并且想要显示集合的子集,显示依赖于浏览器宽度的项数。根据屏幕大小显示Backbone.js集合的子集

例如:集合中的20个项目。每个ItemView以100px宽的div显示。

如果浏览器宽度为< = 600px的,只显示5等

我不得不在任一侧上的按钮改变为其中阵列中开始显示的视图表示指数。

我可以得到数组的子集,使用循环遍历起始索引 - >显示的数目和Collection.at(i)。

//var collection already exists 
var subset = new Collection(); 
var N = floor(screenwidth/100); 
for(var i = index; i< index+N; i++){ 
    subset.add(collection.at(i)); 
} 

如何将屏幕宽度传递到渲染函数,以及如何重新渲染屏幕尺寸更改? jquery会以某种方式绑定resize事件吗?

(注:数字显示的逻辑是不完全正确的,因为我还不知道最好的多少相对于其他屏幕元素)

谢谢!

回答

1

我会建议你使用另一种方法:

  1. 添加代表当前项目的知名度布尔属性您 收藏的模型。
  2. 取决于相应View的render方法中DOM元素的属性更改可见性(通过CSS display 属性)。

因此,代码可能是这样的:

var MyModel = Backbone.Model.extend({ 
    defaults: { 
     ... 
     display: true 
    }, 
    ... 
}); 

var MyCollection = Backbone.Collection.extend({ 
    model: MyModel, 
    ... 
}); 

var MyItemView = Backbone.View.extend({ 
    model: MyModel, 
    ... 
    render: function() { 
     if (this.model.get('display')) 
      this.$el.html(this.template(this.model.toJSON())).show(); 
     else 
      this.$el.hide(); 
    }, 
    ... 
}); 

var MyCollectionView = Backbone.View.extend({ 
    collection: MyCollection, 
    ... 
    initialize: function() { 
     $(window).resize(_.bind(this.resize, this)); 
    }, 
    resize: function() { 
     ... 
     var N = floor(screenwidth/100); 
     this.collection.each(function(model, i) { 
      model.set('display', i < N); 
     }); 
    }, 
    ... 
}); 
+1

经过进一步研究,另一可能性是为贯彻落实“过滤器”功能,木偶文件规定, [“的CollectionView:过滤器“](http://marionettejs.com/docs/v2.4.1/marionette.collectionview.html#collectionviews-filter) 'filter:function(child,index,collection){return index> displayIndex && index <( screenwidth确定号码)}'.....想法? – mix3d 2015-03-31 12:43:39

+0

我实现了这个逻辑,它运作良好。但是,有两件重要的事情是必须的:在初始化传递(MyCollectionView)中绑定它后调用resize,并设置'modelEvents:{“change”:“render”}',否则它不会初始化为第一遍,并且模型不会自动呈现它们自己。注意我正在使用Marionette 2.4.1,而不是你的裸机。在标记为已回答之前,我会等待另一种方法,但这确实有效。谢谢! – mix3d 2015-03-31 15:16:59

+0

这种方法的一个缺点是它需要将所有项目渲染到DOM,如果集合中的元素很大,这可能是禁止的。 (分页等) – mix3d 2015-03-31 15:50:11