【问题标题】:Use Backbone.View events method through a mixin通过 mixin 使用 Backbone.View 事件方法
【发布时间】:2016-02-20 18:31:29
【问题描述】:

我在应用程序中使用 Backbone 和 Coffeescript。现在,我将使用的示例尽可能简单。我的应用程序中有一个标题,所有视图都共享它。此标头具有带有#logout 索引的注销链接。现在我要做的是将事件方法和事件在触发时将使用它的方法放在一个mixin对象中,并扩展我的Backbone View的原型。代码如下:

Mixin.Header =
  events: ->
    'click #logout': 'logout'

  logout: (e)->
    e.preventDefault()
    $.ajax(
      type: 'DELETE' 
      url: '/logout'
    ).then(
      ->
        document.location = ''
    )

class View extends Backbone.View
  initialize: (options)->
    _.extend(View.prototype, Mixin.Header)

我一直在查看 Backbone 源代码,但我根本找不到为什么它不起作用的问题。事件通过 delegateEvents() 方法委托给 View,当 View 初始化时,首先调用 initialize 方法。

【问题讨论】:

    标签: javascript events backbone.js coffeescript mixins


    【解决方案1】:

    来自fine manual

    事件 view.eventsview.events()
    [...]
    Backbone 将在实例化时自动附加事件侦听器,就在调用 initialize 之前。

    您正试图在 initialize 中添加事件,但事件是在调用 initialize 之前绑定的

    您可以在更新原型后自己致电delegateEvents 重新绑定事件:

    initialize: (options)->
      _.extend(View.prototype, Mixin.Header)
      @delegateEvents() # <----------
    

    但结构会有点奇怪,因为您要在实例中修改类。

    我认为你最好在有任何实例之前修改类:

    class View extends Backbone.View
    _.extend(View.prototype, Mixin.Header)
    

    或者您可以使用 prototype 的 CoffeeScript 快捷方式:

    class View extends Backbone.View
    _.extend(View::, Mixin.Header)
    # -----------^^
    

    甚至:

    class View extends Backbone.View
      _.extend(@::, Mixin.Header)
    

    如果View 有自己的events,您仍然会遇到问题,因为_.extend 会盲目地覆盖属性而不是合并它们。您需要比 _.extend 更智能的东西才能正确处理此问题,并且它需要能够弄清楚如何合并 events 函数和对象。

    【讨论】:

    • 谢谢。在深夜发布问题后,早上(当然)我在文档中发现视图事件在创建该视图的实例之前已附加,但您甚至为此提供了解决方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多