Я пишу плагин на основе этого удобного шаблона для плагинов 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
вопросов, имеет какое-то значение?) Мой вопрос не "как это исправить?" но "почему это работает?"
Возврат false из функции обратного вызова, переданной each
из них, выйдет из цикла. Я не проверял, но, возможно, jQuery также нарушит любое значение false, кроме undefined
.
Поскольку в CoffeeScript присутствует неявный возврат, вы, возможно, возвращали что-то ложное или даже ложное из обратного вызова в зависимости от выполняемой в нем операции.
Чтобы избежать каких-либо проблем, просто измените data
для true
в конце.
return
в функции итератора, чтобы явно вообще ничего не возвращать. AFAIK,each
jQuery проверяет наfalse
а не на ложное значение.