Непоследовательное поведение jQuery each () с необъяснимым исправлением

0

Я пишу плагин на основе этого удобного шаблона для плагинов jQuery на основе классов: https://gist.github.com/rjz/3610858

Все работает очень хорошо. Однако, когда я регистрирую плагин, возникает неожиданное поведение:

$.fn.extend markdownAsides: (option, args...) ->
  @each ->
    $this = $(this)
    data = $this.data('markdownAsides')  

    if not data?
      $this.data 'markdownAsides', (data = new MarkdownAsides(this, option))
    if typeof option is 'string'
      data[option].apply(data, args)

    data # Plugin breaks without this line

Прежде чем я добавил эту финальную строку (решение, которое я обнаружил исключительно при аварии), начальная конструкция плагина работала нормально, но при последовательных вызовах метода each цикл jQuery иногда не выполнялся для каждого элемента.

Проверка this.size() вне each цикла вернула правильное значение, и проверка отдельных элементов вне цикла также выглядела отлично. Но внутри цикла элементы иногда пропускались, в шаблоне я не мог различить.

Как я уже сказал, проблема устраняется добавлением окончательной строки. (Возможно, возвращаемое значение функции, передаваемой each вопросов, имеет какое-то значение?) Мой вопрос не "как это исправить?" но "почему это работает?"

Теги:
coffeescript

1 ответ

3
Лучший ответ

Возврат false из функции обратного вызова, переданной each из них, выйдет из цикла. Я не проверял, но, возможно, jQuery также нарушит любое значение false, кроме undefined.

Поскольку в CoffeeScript присутствует неявный возврат, вы, возможно, возвращали что-то ложное или даже ложное из обратного вызова в зависимости от выполняемой в нем операции.

Чтобы избежать каких-либо проблем, просто измените data для true в конце.

  • 1
    Вы также можете использовать явный return в функции итератора, чтобы явно вообще ничего не возвращать. AFAIK, each jQuery проверяет на false а не на ложное значение.
  • 0
    Ах! Это имеет смысл. Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню