Javascript 正在尝试创建select2包装
我正在尝试围绕select2创建一个包装器,它可以接受url或包含数据的数组。 如果我将数据传递给包装器,那么我希望在输入每封信后都不触发ajax请求 如果传递数据然后禁用ajax请求(无需复制代码和if),如何配置此行为 基本上如下代码Javascript 正在尝试创建select2包装,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
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
el.select2
的参数是选项的对象,它不必是对象文字,只需是对象。这意味着您可以根据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
函数不再需要与=>
绑定init
,以提供对象中的URL或数据数组,这样您就可以说:
SelectTwo.init(el, 'pancakes', url: '...')
SelectTwo.init(el, 'pancakes', data: [ ... ])
而不是(IMO)更麻烦的:
SelectTwo.init(el, 'pancakes', '...')
SelectTwo.init(el, 'pancakes', undefined, [ ... ])
我发现,如果存在多个位置参数,则位置参数会变得丑陋,当存在抑制早期非可选参数的可选参数时,情况更是如此