Доступ к атрибутам данных элемента с помощью Twitter Typeahead.js

Я использую Rails для создания своих форм. Я хочу использовать Twitter Typeahead для автозаполнения полей ассоциациями модели.

Следующий код CoffeeScript:

console.log $('.typeahead').data('source')

работает и возвращает:

["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]

Могу ли я получить доступ к тем же данным из функции typeahead? Следующий код:

$('.typeahead').typeahead(
    name: 'test'
    local: $(this).data('source')
    console.log $(this).data('source'))

не работает и возвращает undefined.


person allesklar    schedule 29.01.2014    source источник


Ответы (1)


Самый простой способ — сохранить ссылку на объект jQuery и использовать ее вместо this:

$input = $ '.typeahead'
$input.typeahead
    name: 'test'
    local: $input.data 'source'

Проблема в том, что $(this).data('source') оценивается до его передачи в .typeahead(). На данный момент this по-прежнему настроен на глобальную область, к которой не привязаны данные.

Другой вариант, который работает, даже если у вас есть несколько элементов .typeahead, заключается в ручном вызове .each() вместо того, чтобы полагаться на .typeahead() для перебора выбранных элементов:

$('.typeahead').each ->
    $(this).typeahead
        name: 'test'
        local: $(this).data 'source'

Это работает, потому что функции, переданные .each(), «запускаются в контексте текущего элемента DOM, поэтому ключевое слово this относится к элементу» (см. документы).

person sjy    schedule 30.01.2014
comment
Я считаю, что это не будет работать на моих страницах с более чем одним классом .typeahead. На данный момент я использую обходной путь и продублировал код js с уникальными элементами идентификатора для каждого поля, которое я хочу автозаполнять. Я должен сделать это для всего сайта, и это не элегантно, но пока работает. - person allesklar; 30.01.2014
comment
Я добавил альтернативу, в которой есть несколько элементов .typeahead. - person sjy; 31.01.2014
comment
Фантастика. Именно то, что я хотел сделать. Ты жжешь! - person allesklar; 31.01.2014