Marionette.js 行为可以触发事件吗?

Can a Marionette.js Behavior trigger an Event?

我在 Marionette 中有一个行为,用于处理检测滑动事件的逻辑。我的每个子视图都包含此行为以了解它们何时发生滑动手势。我的问题是,一旦我的 Behavior 确定发生了滑动,它如何将此信息发送到它的 View?

如果行为可以触发一些可以监听的事件,而不是通过其相应的视图,而是通过布局视图(父视图),那就更好了。

这种事情可能吗?谢谢!

这绝不是唯一的解决方案,而是一种非常木偶的方法。使此解决方案成为可能的两个要素是

  1. Layout.childEvents的Marionette2.4.0中的介绍。 LayoutView 的子视图中触发的事件将使用 LayoutView.childEvents.
  2. 冒泡到父 LayoutView
  3. 每个行为都有一个对其附加的视图实例的引用。我们可以从 行为
  4. 中触发此视图的事件

这就是我的想法。首先让我们设置我们期望行为在 LayoutView 中发出的事件。

Marionette.LayoutView.extend({
  // This callback will be called whenever a child emits a `view:swipe` event
  childEvents: {
    'view:swipe': 'onChildSwipe'
  }
});

然后,我们在Behavior中设置swipe handler来触发事件在它所在的instance view上。这个事件会先命中view,然后会继续冒泡直到 LayoutView.onChildSwipe 将处理事件的 LayoutView。

Marionette.Behavior.extend({
    handleSwipe: function(e) {
        // Do processing...
        this.view.trigger('view:swipe', data);
    }
});

您的 LayoutView 中可能有多个子视图,并且您可能希望以不同方式处理滑动。如何识别视图有很多方法。最一般的,就是在trigger中发送view,所以可以这样修改上面的handleSwipe

    handleSwipe: function(e) {
        // Do processing...
        this.view.trigger('view:swipe', this.view, data);
    }

和您的 LayoutView.onChildSwipe 将负责识别视图(例如通过查看其 model.id)并采取相应的行动。