javascript - 将事件委托(delegate)给 Backbone 中的父 View

标签 javascript model-view-controller events backbone.js delegation

我的 View TuneBook 有几个 ClosedTune 类型的 subview 。 OpenTune,我还为每首曲子提供了单独的完整页面浏览量。相同的事件绑定(bind)在 ClosedTuneOpenTune 中,因此我设计了我的应用程序,使它们都继承自共享的“抽象” View Tune.

为了使我的应用程序更具可扩展性,我希望将每个 ClosedTune 的事件委托(delegate)给 TuneBook,但为了可维护性,我希望使用相同的处理程序(存储的那些在 Tune 中)以供 TuneBook 使用(尽管它们显然需要包含在某些函数中)。

我遇到的问题是,在 TuneBook 中,找到正确的 ClosedTune 来调用处理程序。构建此架构的好方法是什么,或者是否有其他好的解决方案可以将事件委托(delegate)给父 View ?

注意 - 不是 Backbone View: Inherit and extend events from parent 的副本(这是关于从父类继承的子类,而我问的是 DOM 中父类的子节点的子类)

最佳答案

在您的父 View 中(也从 Backbone.Events 扩展),我会将 onEvent 绑定(bind)到 DOM 事件。在触发时,它会触发一个 Backbone 事件,其中包括您的 subview 知道的一些“id”属性(大概是一些行 ID?)。

var TuneBook = Backbone.View.extend(_.extend({}, Backbone.Events, {
    events: {
        "click .tune .button": "clickHandler"
    },
    clickHandler: function (ev) {
        this.trigger('buttonClick:' + ev.some_id_attr, ev);
    },

}));

然后, subview 自然会订阅与他们相关的父 View 事件。下面我在 initialize 中执行此操作,传递父 View 以及您之前在 options 中使用的特殊 id 属性。

var ClosedTune = Backbone.View.extend({

    initialize: function (options) {
        options.parent.on('buttonClick:' + options.id, this.handler, this);
    },

    handler: function (ev) {
        ...
    },

});

当然,您也可以在 TuneOpenTune 上设置类似的订阅者。

关于javascript - 将事件委托(delegate)给 Backbone 中的父 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10485610/

相关文章:

javascript - Nodejitsu 和 bower 安装

javascript - 如何从ajax成功回调函数中读取javascript变量

JSP 表达式语言不从 JavaBean 呈现属性

iphone - View 或 View Controller 中的“逻辑”?

android - 从 Android 通过 EventChannel 接收字符串

javascript - 动态生成页面中的事件处理

javascript - 如何控制div的水平滚动?

javascript - 基于 Controller 命名空间约定延迟加载外部 JS/CSS 文件?

java - 在背景框架上使用 Java KeyListener

javascript - 编译器不抛出 "Cannot find module"错误