используя $(this) со сценарием кофе

Я использую загрузку файла запроса. У меня есть несколько форм на странице, каждая из которых идентична, за исключением скрытого поля под названием «проект». Вот кофейный скрипт, который обрабатывает загрузку:

jQuery ->
  $(document).ajaxComplete ->
    $('.project_file').fileupload
      dataType: "script"
      url: ($(this).prev('form').attr("action"))
      paramName: 'file_yo'
      formData: (form) -> 
        [{ name: 'authenticity_token',  value: $('meta[name="csrf-token"]').attr('content')}, { name: 'project',value: $(this).prev().val()}]
      alert($(this).prev().val())
      done: (e, data) ->
        $('#finish-text').html "Upload finished"

Вот html для одной из форм. Единственное, что меняется от формы к форме, — это значение скрытого поля под названием «проект».

<form accept-charset="UTF-8" action="/projects/6/project_files" class="edit_project" data-remote="true" id="project_file_form" method="post"><div style="margin:0;padding:0;display:inline">        <input name="utf8" type="hidden" value="✓"><input name="_method" type="hidden" value="patch"><input name="authenticity_token" type="hidden" value="iIQXYRJfXRFAaSsvSpb4H+HEUMeAI3pubXDRyd+2Ehk="></div>
    <input id="project" name="project" type="hidden" value="6">
    <input authenticity_token="true" class="field file-field project_file" id="" name="file_yo" title="" type="file" value="">  
</form>

Проблема в том, что $(this) не определено. Когда появляется предупреждение, оно говорит, что не определено. Как мне заставить $(this) вернуть конкретный элемент с классом 'project_file', как и должно быть?

ОБНОВИТЬ:

Вот во что компилируется сценарий кофе:

(function() {
  jQuery(function() {
    $(document).ajaxComplete(function() {
      return $('.project_file').fileupload({
        dataType: "script",
        url: $(this).prev('form').attr("action"),
        paramName: 'file_yo',
        formData: function(form) {
          return [
            {
              name: 'authenticity_token',
              value: $('meta[name="csrf-token"]').attr('content')
            }, {
              name: 'project',
              value: $(this).prev().val()
            }
          ];
        }
      }, alert($(this).prev().val()));
    });
    return {
      done: function(e, data) {
        return $('#finish-text').html("Upload finished");
      }
    };
  });

}).call(this);

person Philip7899    schedule 21.03.2014    source источник


Ответы (2)


Имейте в виду, что параметры оцениваются при вызове $('.project_file').fileupload(), поэтому, даже если $(this) соответствует вашим ожиданиям, вы будете устанавливать одинаковые url для каждого загрузчика. Я не думаю, что ajaxComplete устанавливает какой-либо конкретный контекст, поэтому this внутри этого обратного вызова сам по себе не очень полезен.

Если вам нужны разные параметры для каждого экземпляра, вам придется так сказать:

$('.project_file').each ->
  $(@).fileupload
    #... $(@) should be what you want in here

Я не знаю, почему вы привязали это к ajaxComplete, но на первый взгляд это кажется странным, я ожидаю, что это будет обрабатываться непосредственно $(document).ready(...).

person mu is too short    schedule 21.03.2014

Вы забыли сделать отступ alert, посмотрите, как компилируется ваш код:

jQuery(function() {
  return $(document).ajaxComplete(function() {
    return $('.project_file').fileupload({
      dataType: "script",
      url: $(this).prev('form').attr("action"),
      paramName: 'file_yo',
      formData: function(form) {
        return [
          {
            name: 'authenticity_token',
            value: $('meta[name="csrf-token"]').attr('content')
          }, {
            name: 'project',
            value: $(this).prev().val()
          }
        ];
      }
    }, alert($(this).prev().val()), {
      done: function(e, data) {
        return $('#finish-text').html("Upload finished");
      }
    });
  });
});
person TimWolla    schedule 21.03.2014
comment
Странно, у меня не компилируется. Я опубликую то, что мое компилируется - person Philip7899; 22.03.2014
comment
@ Philip7899 Это мало что меняет. Посмотрите, где сидит ваш alert, он совершенно не в том месте. Попробуйте сделать отступ, возможно, это то, что вы хотели. - person TimWolla; 22.03.2014
comment
Я не понимаю, что вы имеете в виду. Это с отступом в моем файле. Я попытался изменить пробелы с помощью вкладок, но он компилируется в одно и то же. - person Philip7899; 22.03.2014
comment
@Philip7899 Philip7899 Я подозреваю, что вы хотите, чтобы alert было внутри вашей функции formData, в этом случае добавьте еще два пробела, если не ясно укажите, что вам нужно. И еще: взгляните на свой скомпилированный код и проверьте, считаете ли вы его нормальным. - person TimWolla; 22.03.2014
comment
Предупреждение предназначено только для целей отладки. Как видите, для параметра значения установлено значение $(this).prev().val(), и я хочу убедиться, что это значение правильное. - person Philip7899; 22.03.2014
comment
Как вы думаете, что this находится внутри обратного вызова ajaxComplete? - person mu is too short; 22.03.2014