Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正在尝试创建select2包装_Javascript_Coffeescript_Jquery Select2 - Fatal编程技术网

Javascript 正在尝试创建select2包装

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

我正在尝试围绕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

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,因为这比一堆
    +
    和引号更清晰
  • AJAX
    url
    函数不再需要与
    =>
    绑定
  • 根本不需要任何实例变量(当然,除非其他地方发生了一些事情)
  • 我将参数切换到
    init
    ,以提供对象中的URL或数据数组,这样您就可以说:

    SelectTwo.init(el, 'pancakes', url: '...')
    SelectTwo.init(el, 'pancakes', data: [ ... ])
    
    而不是(IMO)更麻烦的:

    SelectTwo.init(el, 'pancakes', '...')
    SelectTwo.init(el, 'pancakes', undefined, [ ... ])
    
    我发现,如果存在多个位置参数,则位置参数会变得丑陋,当存在抑制早期非可选参数的可选参数时,情况更是如此