3

场景是这样的:我有一个collectionView在几个地方使用的。我将一些选项传递到视图中以更改某些显示方面(主要是冗长的),因为在任何地方的行为都是完全相同的。

我真的很想将此自定义扩展到emptyView,但我找不到这样做的方法。似乎没有对collectionViewon 的引用emptyView,而且我似乎也无法emptyViewcollectionView, 在定义它之外访问。

基本上,我希望能够做这样的事情:

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 }}在其模板中呈现。

除了修改木偶之外,有什么办法可以做到这一点?

4

3 回答 3

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 函数的功能,您可以在那里进行适当的逻辑检查和验证。

于 2013-06-21T16:00:18.530 回答
1

自从提出这个问题以来已经有一段时间了,但它可能对任何寻找的人都有帮助:

Marionette CollectionView 现在有一个 emptyViewOptions 属性,它的工作原理与 itemViewOptions 完全相同,但用于 emptyView:

http://marionettejs.com/docs/v2.4.2/marionette.collectionview.html#collectionviews-emptyviewoptions

于 2015-07-31T10:48:15.497 回答
-3

其实你可以通过这种方式访问​​emptyView:

this.children._views[_.keys(this.children._views)[0]];

似乎在新版本中我们将有一个允许获取emptyView. https://github.com/marionettejs/backbone.marionette/pull/727

于 2013-06-21T16:03:54.117 回答