Coffeescript / jQuery Pattern: кэширование данных через события - PullRequest
2 голосов
/ 29 апреля 2011

У меня есть список предметов, которые являются рефератами, и их можно расширить с помощью Ajax по щелчку.Я написал следующий код в Coffeescript:

current_open_row = null

$('li.faq-item').live 'click', (event) ->
  $.post("/faqs/update_rows", {old_row_id: current_open_row, new_row_id: $(this).attr('id')}, (data) ->
    replace_items data
  , 'json')
  current_open_row = $(this).attr('id')

Это не выглядит как гладкий Coffeescript, и я думаю: «Что я мог бы сделать лучше», но, в частности, создание экземпляра current_open_row Переменная вне области действия обработчика щелчка выглядит странно.Несоблюдение этого требования, конечно же, приводит к созданию нового экземпляра при входе в обработчик, который всегда неопределен.

Кроме рефакторинга $(this).attr('id') в переменную, есть ли что-то, что выпрыгивает как уродливый, неоптимальный, нечитаемыйи т. д., или это так?

Спасибо!

1 Ответ

2 голосов
/ 29 апреля 2011

Ну, во-первых, я думаю, вы в конечном итоге переключитесь на camelCase ... Я знаю, что многие люди предпочитают readability_of_underscores, но каждая библиотека, с которой вы взаимодействуете (включая jQuery), использует camelCase.Просто кое-что, что нужно иметь в виду.

Если оставить в стороне, вопрос о необходимости охвата переменных с помощью = null является хорошим.Я пытался убедить Джереми, что должен быть более приятный синтаксис, но он категорически против.Поэтому я бы предложил переместить переменную в свойство объекта.К счастью, это jQuery, поэтому есть много мест для хранения данных.Как насчет использования метода списка .data ?Это имеет дополнительное преимущество: если вы хотите сделать это в нескольких списках в будущем (с одним current_open_row в каждом списке), вам не придется менять свой код на один бит.Просто добавьте больше списков с .faq-item дочерними элементами в разметку.

Еще один незначительный момент: вы даете post вызову обратный вызов

(data) -> replace_items data

Если это все, что вы делаете,почему бы просто не передать replace_items напрямую?:)

Я бы также поместил каждый аргумент функции post в свою строку для удобства чтения.Пары ключ-значение автоматически объединяются в один объект, даже без фигурных скобок.Вот как все это выглядит:

$('li.faq-item').live 'click', (event) ->
  $row = $(this)
  $list = $row.parent()
  row_id = $row.attr 'id'

  $.post(
    "/faqs/update_rows",
    old_row_id: $list.data('current_open_row'),
    new_row_id: row_id,
    replace_items,
    'json'
  )

  $list.data 'current_open_row', row_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...