#javascript #coffeescript #jquery-select2
#javascript #coffeescript #jquery-select2
Вопрос:
Я пытаюсь создать оболочку вокруг select2, которая может либо принимать URL-адрес, либо массив, содержащий данные. Если я передам данные оболочке, то я хочу отключить запуск запросов ajax после каждой введенной буквы.
Как я могу настроить это поведение, если данные передаются, а затем отключить ajax-запросы (без необходимости копировать код и указывать if)
В основном следующий код
SelectTwo.init = (el, text, url, data = []) ->
@_url = url
@_data = data
el.select2
placeholder: text
minimumInputLength: 2
data: @_data
ajax:
url: (term) =>
@_url '/' term
dataType: "json"
results: (data, page) ->
results: data
Ответ №1:
Аргумент el.select2
является объектом options, он не обязательно должен быть объектным литералом, просто object . Это означает, что вы можете создавать объект по частям на основе аргументов init
.
Вы могли бы сделать что-то вроде этого:
SelectTwo.init = (el, text, data_source = { }) ->
select_opts =
placeholder: text
minimumInputLength: 2
if(data_source.url)
select_opts.ajax =
url: (term) -> "#{data_source.url}/#{encodeURIComponent(term)}"
dataType: "json"
results: (data, page) ->
results: data
else if(data_source.data)
select_opts.data = data_source.data
else
# handle this however you want
el.select2 select_opts
Некоторые интересные моменты:
- Я добавил
encodeURIComponent
оболочку вокруг поискового запроса, потому что я параноик, и это хорошая привычка. - Я переключаюсь на интерполяцию строк для построения URL-адреса поиска, поскольку это для меня понятнее, чем куча
- Больше нет необходимости связывать
url
функцию AJAX с=>
. - Вообще нет необходимости в каких-либо переменных экземпляра (если, конечно, что-то не происходит в другом месте).
-
Я переключил аргументы на
init
, чтобы указать URL-адрес или массив данных в объекте, чтобы вы могли сказать:SelectTwo.init(el, 'pancakes', url: '...') SelectTwo.init(el, 'pancakes', data: [ ... ])
вместо (IMO) более громоздкого:
SelectTwo.init(el, 'pancakes', '...') SelectTwo.init(el, 'pancakes', undefined, [ ... ])
Я нахожу, что позиционные аргументы становятся уродливыми, если их больше пары, вдвойне, когда есть необязательные аргументы, которые подавляют предыдущие необязательные аргументы.