2012-01-25 3 views
1

У меня есть мнение Backbone.js, которая имеет следующий АЯКС вызов:Доступ взгляд изнутри АЯКС успеха() вызов

BackboneDemo.Views.Projects.ProjectView extends Backbone.View 

    demoFunction:() -> 
    ... 
    ... 
    @collection.create(new_project_attributes, 
     success: -> 
     console.log @ 
     $('#' + @options.query_id).html('Saved successfully').delay(1500).fadeOut(500, -> $(@).remove()) 

Проблема есть, this внутри вызова успеха возвращает DOMWindow, а не вид в котором находится @options.query_id. (Да, demoFunction привязан к виду).

Как получить доступ к атрибутам вида из вызова AJAX success() в базовой линии?

ответ

3

идиоматические CoffeeScript путь будет использовать fat arrow связать функцию обратного вызова к this, что вы хотите быть:

Жирная стрелка => может использоваться как для определения функции, и привязать его к текущему значению this, прямо на месте. Это полезно при использовании обратного вызова на основе библиотек, как Prototype или JQuery, ...

Так что-то вроде этого:

@collection.create(new_project_attributes, 
    success: => 
    console.log @ 
    $('#' + @options.query_id).html('Saved successfully').delay(1500).fadeOut(500, -> $(@).remove()) 

Похоже, вы хотите this быть элемент, который вы выведении во внутреннем обратном вызове, чтобы вы оставили эту тонкую стрелу (->).

И простая демонстрация разницы между => и ->: http://jsfiddle.net/ambiguous/vGHrM/

+0

Это полезный материал. Я не очень много работал с CoffeeScript, но каждый день вижу что-то, что заставляет меня сказать: «Человек, я должен начать». –

+0

@Rob: Как и большинство вещей, у CoffeeScript есть хорошие вещи (такие как '=>' и destructured assign) и плохие вещи (такие как [чувствительные к форматированию] (http://stackoverflow.com/questions/9014970/why-does -coffeescript-требует-пробельного-после-карты)). Вы можете выбрать CoffeeScript на боковой панели «Панели» на jsfiddle.net, если вам нужен простой способ поиграть с ним, есть также переводчик «Try CoffeeScript» на http://coffeescript.org/. –

3

Самый простой способ (без вызова какой-то «связывания» вспомогательной функции) является только локально хранить ссылку на this вы хотите использовать:

demoFunction:() -> 
    ... 
    var self = this; 
    @collection.create(attrs, success: -> 
     // use self.options.query_id 
     ... 
Смежные вопросы