有没有办法迭代Marionette中的所有视图?

时间:2015-05-15 19:05:47

标签: backbone.js marionette backbone-views

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

2 个答案:

答案 0 :(得分:1)

使用vent访问视图功能

注意在Marionette 3.0中已弃用vent消息系统,但我会在此向您展示常规功能,然后将您引导至使用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对象上设置一个hanlder,当您在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,以便不必修改上述过程。由于Marionette将Wreqr加载到Backbone对象上,您只需设置

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

你已经完成了。

答案 1 :(得分:0)

您可以利用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