【问题标题】:Why wont' backbone fire my event?为什么骨干不会触发我的活动?
【发布时间】:2015-11-02 15:39:42
【问题描述】:

我的班级定义如下:

class NewUser extends Backbone.View
  template : JST["backbone/templates/events/new"]
  events : 
    'click button' : 'hello'
  hello : ->
    alert('hi')
  render : ->
    @el = $(@template())
    @ 

我初始化页面如下:

$('body').append(new NewUser().render().el)

但是,当我单击按钮时,不会显示任何警报。有人看到我的代码有什么问题吗?视图呈现,但事件从未注册。

【问题讨论】:

    标签: javascript backbone.js coffeescript


    【解决方案1】:

    您正在render 方法中创建您的@el

    render : ->
        @el = $(@template())
        @ 
    

    但你忽略了拨打delegateEvents

    使用 jQuery 的 delegate 函数为视图中的 DOM 事件提供声明性回调。 [...] 默认情况下,delegateEvents 在 View 的构造函数中为您调用 [...]

    因此,您的事件永远不会绑定到您添加到 DOM 的 @el,并且您的按钮没有任何用处。你的render 应该是这样的:

    render : ->
        @el = $(@template())
        @delegateEvents()
        @
    

    【讨论】:

    • delegateEvents 在视图初始化期间被调用,由于它使用 jQuery 的委托方法,因此无需再次调用。
    • @Paul:但是他在初始化之后替换了@el,所以任何现有的代表都会消失,玩这个,你会看到:jsfiddle.net/ambiguous/SA6RB
    • @Paul:我最近在这方面给某人上了一课 (stackoverflow.com/a/8932216/479863),所以我觉得很新鲜。
    【解决方案2】:

    模板的按钮部分是否被渲染到视图的el

    如果不是,则不会触发 hello 事件,因为事件哈希仅限于视图本身内的事件。在这种情况下,您将需要手动绑定到 render 方法中的事件

    render : ->
      @el = $(@template());
      $('#buttonId').click(@hello);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多