Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.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 rails应用程序中的Typeahead:只向一个特定请求追加JSON请求,而不是通过预取向每个请求追加JSON请求_Javascript_Ruby On Rails_Ruby_Json_Twitter Typeahead - Fatal编程技术网

Javascript rails应用程序中的Typeahead:只向一个特定请求追加JSON请求,而不是通过预取向每个请求追加JSON请求

Javascript rails应用程序中的Typeahead:只向一个特定请求追加JSON请求,而不是通过预取向每个请求追加JSON请求,javascript,ruby-on-rails,ruby,json,twitter-typeahead,Javascript,Ruby On Rails,Ruby,Json,Twitter Typeahead,提前输入功能在它应该工作的地方工作。但问题是,提前输入功能会在每个数据请求上发出JSON请求,而实际上只会在一个特定请求上发出JSON请求 我有以下控制器: #controllers/agencies_controller.rb class AgenciesController < ApplicationController def get_unique_agency_names @unique_agency_names = Agency.uniq.pluck(:name)

提前输入功能在它应该工作的地方工作。但问题是,提前输入功能会在每个数据请求上发出JSON请求,而实际上只会在一个特定请求上发出JSON请求

我有以下控制器:

#controllers/agencies_controller.rb
class AgenciesController < ApplicationController

  def get_unique_agency_names
    @unique_agency_names = Agency.uniq.pluck(:name)
    respond_to do |format|
      format.json { render json: @unique_agency_names }
    end
  end
  ...
end
作为补充,我希望在这里实现这一功能:以这种形式:

# just showing the relevant part of the form
<div class="form-group" id="prefetch">
  <%= f.label :name_cont, "Agency Name" %>
  <%= f.text_field :name_cont, class: "form-control typeahead name_input", placeholder: "Enter Agency Name" %>
</div>
我的具体问题是:如何确保只在应该调用时才调用
GET”/agents/GET\u unique\u agency\u names“
?现在,它正在为每个请求追加这个JSON请求。我只希望JSON请求发生在一个特定的请求中

我想你需要这个

  $('#prefetch .typeahead.name_input').typeahead(null, {
    generateOnLoad:false,
    name: 'agency_names',
    source: agency_names
  });
generateOnLoad{boolean}

null(默认值)

如果启用,源数据将在页面加载时生成(执行Ajax请求并准备搜索数据),而不是等待集中输入

请注意:除非调整了其他一些配置,否则此选项不能与dynamic:true一起正常工作

此外,如果您发现rails清单文件将调用添加到每个页面,只需在绑定type ahead之前检查元素是否存在:

if($('#prefetch .typeahead.name_input').length){
      $('#prefetch .typeahead.name_input').typeahead(null, {
        generateOnLoad:false,
        name: 'agency_names',
        source: agency_names
      });
}

我建议使用一种“限制”请求的策略,而不是通过编程强制执行单个请求,因为您似乎正在处理一个大型数据集。您可以设置猎犬的
预取
选项来缓存您可以缓存的内容,并设置
足够
远程
选项来确保对JSON文件的请求被反向填充并且速率有限。为Typeahead的
minLength
选项设置更高的值作为最后一道防线

将在一定程度上为您服务,因为它依赖于浏览器的本地存储进行缓存,而缓存的容量有限。如果您的数据集很大,它将只缓存一部分,初始化后将需要进一步的请求

在初始化后处理请求,并可以为您取消或限制这些请求,从而减少请求数量。请参阅
url
rateLimitBy
rateLimitWait
选项,这些选项可以作为哈希值分配给
remote
。此外,如果未达到您的数据计数,猎犬将使用
remote
回填其他数据


最后,不要传递
null
,并将
minLength
选项设置为高于Typeahead构造函数上的默认值
1
。这将防止对数据集进行过多的查找。只需确保
minLength
值比最小可能结果的长度短。

这不就是
预取的事情吗?“预取的数据在初始化时被提取和处理。”@DaveNewton我在想这个。我只是不确定我应该把什么放在它的位置上。不预取吗?只在有意义的页面上预取?猎犬回购协议列出了您可以使用的预回迁选项。如果每一个请求都包含这个JS,这意味着这个JS即使在不重要的页面上也被包含,而非绝对URL意味着它将把这个URL附加到你所在的任何页面上。
  $('#prefetch .typeahead.name_input').typeahead(null, {
    generateOnLoad:false,
    name: 'agency_names',
    source: agency_names
  });
if($('#prefetch .typeahead.name_input').length){
      $('#prefetch .typeahead.name_input').typeahead(null, {
        generateOnLoad:false,
        name: 'agency_names',
        source: agency_names
      });
}