有没有办法遍历 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
我真的很想以编程方式遍历每个视图并触发它们的所有点击事件,有没有办法做到这一点?
使用 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
.