场景是这样的:我有一个collectionView
可以在几个地方使用。我将一些选项传递到视图中以更改某些显示方面(主要是措辞),因为到处都是完全相同的行为。
我真的想将此自定义扩展到emptyView
,但我找不到这样做的方法。似乎没有提及collectionView
上的emptyView
,除了定义它之外,我似乎也无法从emptyView
访问collectionView
。
基本上,我希望能够做到这样的事情:
var noItemsView = Backbone.Marionette.ItemView.extend({
tagName: "li",
className: "no-results",
template: Handlebars.compile(noResultsTemplate),
}),
leftToggleListView = Backbone.Marionette.CollectionView.extend({
tagName: "ul",
className: "left-toggle-view-list",
emptyView: noItemsView,
initialize: function() {
this.emptyView.model.set("name": "some custom name");
}
});
然后让noItemsView
能够在其模板中呈现{{ name }}
。
有没有办法实现这一点,没有修改Marionette?
答案 0 :(得分:3)
在collectionView中你可以使用buildItemView,这个函数也会在构建emptyView时被调用
我在jsFiddle http://jsfiddle.net/rayweb_on/TN34P/
中做了一个小小的演示var leftToggleListView = Backbone.Marionette.CollectionView.extend({
tagName: "ul",
className: "left-toggle-view-list",
emptyView: noItemsView,
ValuethatMakesSense : "I do!",
buildItemView: function(item, ItemViewType, itemViewOptions){
var options = _.extend({model: item}, itemViewOptions);
var name = this.ValuethatMakesSense;
var view = new ItemViewType({name : name});
return view;
}
});
在项目视图的初始化功能中,您可以阅读传递的选项。
var noItemsView = Backbone.Marionette.ItemView.extend({
initialize : function (options) {
var name = this.options.name;
console.log(name);
},
tagName: "li",
className: "no-results",
template: "#noresults"
});
我在collectionView中使用了一个属性,然后将其读取/传递给buildItemView中的空视图,只是为了测试buildItemView函数的功能,你可以在那里进行正确的逻辑检查和验证。
答案 1 :(得分:1)
自问这个问题以来已经有一段时间了,但对任何人来说都可能有所帮助:
Marionette CollectionView现在有一个emptyViewOptions属性,其工作方式与itemViewOptions类似,但对于emptyView:
http://marionettejs.com/docs/v2.4.2/marionette.collectionview.html#collectionviews-emptyviewoptions
答案 2 :(得分:-3)
实际上你可以用这种方式访问emptyView:
this.children._views[_.keys(this.children._views)[0]];
似乎在新版本中我们将有一个允许获得emptyView
的方法。
https://github.com/marionettejs/backbone.marionette/pull/727