2015-04-02 2 views
0

Я построил функцию jquery, которая принимает параметры и делает запрос AJAX PUT. Но у меня возникли проблемы с настройкой обратного вызова успеха, потому что это переопределяется. Кто-нибудь знает, как сохранить ценность «этого»?Установите значение «this» в обратном вызове ajax

функция JQuery

(($) -> 
    $.textToInputUpdate = (options) -> 
     functionality = 
     options: $.extend({ 
      'id_for_put': "" 
      'post_url': "" 
      'size': 10 
     }, options) 
     initialize: (event, target) -> 
      # ... 
      self = this 
      field.focusout (event) -> 
      $.ajax 
       url: self.options.post_url 
       type: 'PUT' 
       dataType: "json" 
       data: 
       rubric_item: 
        weight: parseFloat(field.val().trim()) 
       success: (data) -> 
       self.options.success_callback?(data) 

     return functionality 
) jQuery 

Вызов функции JQuery с опциями

$('#rubric').on 'click', '.rubric-item .rubric-value', (e) -> 
    $.textToInputUpdate(
     id_for_put: $(this).parent().attr('id') 
     post_url: $(this).parent().data("post-url") 
     size: 3 
     success_callback: (data) -> 
     # PROBLEM HERE: $(this) gets redefined when actually called in the function above. I want it to be the value of $(.rubric-value). 
     $(this).text(data.description) 
    ) 
    .initialize(e, $(this)) 
+0

'self', похоже, работает, не так ли? – Bergi

+0

@Bergi Конечно, но если вы можете правильно привязать привязки, это упростит разделение функций на именованные на равных уровнях табуляции, если/когда серия обратных вызовов раздувается. Так что все равно приятно знать, даже если вы ленивы и используете «я». – Katana314

ответ

3

просто использовать fat arrow:

$.textToInputUpdate(
    id_for_put: $(this).parent().attr('id') 
    post_url: $(this).parent().data("post-url") 
    size: 3 
    success_callback: (data) => 
#       ^^ 
    $(this).text(data.description) 
) 

Гораздо более идиоматических CoffeeScript чем self или that переменных.

+0

Я не знал, что жирная стрелка была доступна в coffeescript. Это путь. –

2

Вы должны назначить this на другую переменную для последующего использования:

$('#rubric').on 'click', '.rubric-item .rubric-value', (e) -> 
    var that = this; 
    $.textToInputUpdate(
    id_for_put: $(this).parent().attr('id') 
    post_url: $(this).parent().data("post-url") 
    size: 3 
    success_callback: (data) -> 
     $(that).text(data.description) 
).initialize(e, $(this)) 
Смежные вопросы