有没有办法遍历 Marionette 中的所有视图?

Is there a way to iterate through all of the views in Marionette?

我真的很想以编程方式遍历每个视图并触发它们的所有点击事件,有没有办法做到这一点?

使用 vent 访问视图功能

(注意 vent 消息系统已在 Marionette 3.0 中弃用,但我会在这里向您展示一般功能,然后再向您推荐到文档中使用 Marionette.Wreqr,它将替换 vent。Wreqr 是另一个 Marionette 硬依赖。一旦你设置了 Wreqr(这几乎是微不足道的,正如文档将向你展示的那样)这个解释的其余部分实际上是相同的。)

根据 docs 的基本用法是:

var MyApp = new Backbone.Marionette.Application();

// Alert the user on the 'minutePassed' event
MyApp.vent.on("minutePassed", function(someData){
  alert("Received", someData);
});

// This will emit an event with the value of window.someData every minute
window.setInterval(function() {
  MyApp.vent.trigger("minutePassed", window.someData);
}, 1000 * 60);

正如您在上面看到的,您只需在 MyApp.vent 对象上设置一个处理程序,当您在 MyApp.vent 上触发事件时,将调用处理程序。请注意,您触发 MyApp.vent 的参数将传递给处理程序函数。

听听MyApp.vent在你看来

为了触发对每个视图的点击,我们在您的视图上设置了适当的处理程序:

var MyView = Marionette.ItemView.extend({
  initialize: function () {
    this.listenTo(MyApp.vent, "child:view:event", function () { this.$el.click() });
  }
});

所以在任何其他视图中,比如父集合视图,您现在可以触发此事件,每个子视图中的处理程序将被调用。

var MyCollectionView = Marionette.CollectionView.extend({
  triggerChildren: function () {
    MyApp.vent.trigger("child:view:event");
  }
});

使用 Wreqr

Backbone.Wreqr 的完整文档是 here。但我将向您展示如何设置 Wreqr,这样就不必修改上述过程。由于 Wreqr 是由 Marionette 加载到 Backbone 对象上的,所以你所要做的就是设置

MyApp.vent = new Backbone.Wreqr.EventAggregator();

大功告成。

您可以利用 Marionette 的 Backbone.Babysitter 库——它与标准 Marionette 核心一起打包——来访问集合的子视图。

Marionette 使用 Babysitter 来管理对 Collection/CompositeView 的子视图的引用。所以如果你想对所有的视图进行操作,比如说,从父 CollectionView,你可以简单地做:

var MyCollectionView = Marionette.CollectionView.extend({
  triggerChildren: function () {
    this.children.each(function (childview) {
      childview.$el.click();
    });
  }
});

上面的工作是因为 _.each,一个 Underscorejs 函数,混合到视图的 children 对象中。有关可与 children.

一起使用的函数的完整列表,请参阅 Babysitter docs