2014-10-30 26 views
0

我有这样的事情骨干视图,事件处理程序和bindAll

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

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

    functionA: (new_date) -> 
     stuff 

    functionB:() => 
     stuff 

    new MyView(el: $mySelector) 

我想从事件处理程序调用functionB。
我知道,我可以用脂肪箭头,但我怎么会跟_.bindAll

回答

0

首先的做到这一点,我猜$("body").on "click", ".stuff", ->实际上是你initialize方法内你不得不格式化的问题。否则,你的代码不会有很多意义。

你会遇到的问题是,jQuery控制回调函数中的@(AKA this)。所以只需要绑定functionB就不够了,因为如果没有正确的@,您就无法获得functionB

在特定情况下,没有这个真的很重要,因为functionB定义为(使用=>)绑定的功能,你有没有必要在事件处理程序的匿名包装,只需用手on本身的功能:

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

如果由于某种原因你坚持要绑定一个匿名函数,那么你想使用_.bind(或Function.prototype.bind)而不是_.bindAll; _.bindAll将函数(通过名称)绑定到特定的@,但您希望找到特定的函数(没有名称)到特定的@,请参阅What is the difference between these Backbone/Underscore .bind() methods?以获取有关区别的更多讨论。你会这样说:

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

# or 

unbound_function = -> @functionB() 
$("body").on "click", ".stuff", _.bind unbound_function, @ 
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