2014-10-30 2 views
0

У меня есть что-то вроде этогоBackbone View, Event Handler и 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