Javascript rails应用程序中的Typeahead:只向一个特定请求追加JSON请求,而不是通过预取向每个请求追加JSON请求
提前输入功能在它应该工作的地方工作。但问题是,提前输入功能会在每个数据请求上发出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)
#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
});
}