骨干视图,事件处理程序和bindAll

时间:2014-10-30 23:15:26

标签: backbone.js coffeescript underscore.js

我有类似的东西

$ ->
  class MyView extends Backbone.View
    initialize: ->
      stuff

    $("body").on "click", ".stuff", ->
      @functionB()

    functionA: (new_date) ->
      stuff

    functionB: () =>
      stuff

  new MyView(el: $mySelector)

我想从事件处理程序调用函数 我知道我可以使用胖箭,但是如何使用_.bindAll

2 个答案:

答案 0 :(得分:0)

首先,我猜测$("body").on "click", ".stuff", ->实际上在initialize方法中,你只是有格式问题。否则你的代码没有多大意义。

您将遇到的问题是jQuery控制回调函数中@(AKA this)的内容。因此,仅仅绑定functionB是不够的,因为如果没有正确的functionB,您将无法访问@

在您的特定情况下,这一点都不重要,因为functionB被定义为绑定函数(使用=>)并且您不需要在事件处理程序中使用匿名包装器,只需要{ {1}}函数本身:

on

如果由于某种原因你坚持绑定匿名函数,那么你想要使用_.bind(或Function.prototype.bind)而不是_.bindAll; $("body").on "click", ".stuff", @functionB 将函数(按名称)绑定到特定的_.bindAll,但您希望找到特定@的特定函数(没有名称),有关详情,请参阅What is the difference between these Backbone/Underscore .bind() methods?讨论差异。你会说:

@

答案 1 :(得分:0)

由于您使用的是主干,因此您可以使用本机语法进行绑定,=>_bind_bindAll的内置下划线方法。他们做同样的事情,这只是你宣布他们的地方。如果在函数声明中绑定它们,那么如果要处理事件侦听器,则可以引用它们。

$ ->
  class MyView extends Backbone.View
    initialize: ->
      stuff

    $("body").on "click", ".stuff", @functionB
    # alternatively, inline as an anonymous function (then you can 
    # leave the declaration of functionB below as `->` )
    $("body").on "click", ".stuff", => @functionB(arguments...)

    functionA: (new_date) ->
      stuff

    functionB: () =>
      stuff