我真的想以编程方式浏览每个视图并触发所有点击事件,有没有办法做到这一点?
答案 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");
}
});
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。