除非我在控制台中调用$ .parseJSON,否则jQuery UI自动完成功能无法正常工作

时间:2013-01-31 03:59:14

标签: jquery jquery-ui coffeescript jquery-ui-autocomplete

我已经看到很多关于jQuery UI Autocomplete的其他问题,但没有一个完全像我的错误。

我正在使用Rails 3.2和jquery-ui-rails插件(使用jQuery UI Autocomplete 1.9.2)。我的application.js文件的顶部包含我的所有jQuery:

//= require jquery
//= require jquery_ujs
//= require jquery.ui.core
//= require jquery.ui.autocomplete

我按照Railscast #399进行了设置,但我发现我的自动完成过滤实际上并不起作用,除非我进入控制台,在我的源上运行$ .getJSON,然后在$上运行$ .parseJSON。 getJSON responseText。

如果不这样做,我只需从服务器返回的数组中下载可用的字符串。

这是我在HTML中输入的内容:

<%= text_field_tag 'location_name', nil, id: "all_location_search" %>

在该HTML上调用autcomplete的CoffeeScript:

$ ->
  # autocomplete location input
  $('#all_location_search').autocomplete
    source: "/autocompletions/locations"

在AutoCompletionsController#locations:

def locations
  render json: AutoComplete.locations_by(params[:location_name])
end

在AutoComplete.rb中:

def self.locations_by(term)
  current = Profile.pluck(:current_location).reject{|n| n.blank?}
  current.grep(/^#{term}/)
end

现在,如果我将浏览器指向localhost:3000/autocompletions/locations,我会看到以下内容:

["Arlington, VA","Atlanta, GA","Boston, MA","Coral Springs, FL","Philadelphia, PA","Sterling, VA"]

但就像我说的那样,除非我进入控制台,否则运行类似:

locations = $.getJSON("/autocompletions/locations")
locationJson = $.parseJSON(locations.responseText)
$('#all_location_search').autocomplete({source: locationJson});

我实际上并没有过滤器。

有几点需要注意:

  • 我在两个输入上调用.autocomplete。我尝试删除一个,看看是否做了什么,但它没有
  • 我尝试删除每个JavaScript以查看是否有其他文件导致了该问题但未找到任何内容
  • 当我加载jQuery UI Autocomplete应该输入的输入页面时的HTML输出与我在Chrome的开发者控制台中输入以下两个选项时获得的HTML输出相同。

<input id="all_location_search" name="location_name" type="text" data-validate="true" class="ui-autocomplete-input" autocomplete="off">

选项1

$('#all_location_search').autocomplete({source: "/autocompletions/locations"});

选项2

locations = $.getJSON("/autocompletions/locations")
locationJson = $.parseJSON(locations.responseText)
$('#all_location_search').autocomplete({source: locationJson});    

1 个答案:

答案 0 :(得分:0)

我想出了这个问题。首先,使用jQuery UI Autocomplete命中服务器是一个术语参数,所以我必须与之匹配。所以改变我的控制器方法:

def locations
  render json: AutoComplete.locations_by(params[:location_name])
end

要...

def locations
  render json: AutoComplete.locations_by(params[:term])
end

修复它。我在其他答案中看到了这一点,但我不认为我输入了我的术语的区分大小写。只需确保您查找params[:term]