所以,我有一个应用程序,有几个电影剪辑,用户可以搜索特定主题等...我正在使用Ajax处理分页,以便用户可以进行搜索查询并滚动查看更多结果(类似于推特)。
问题是,当用户搜索即“搞笑”时,会出现一堆记录,并且当用户向下滚动时,Ajax将使用新记录加载记录的重复记录。
以下是代码:
if $('.pagination').length
$(window).scroll ->
url = $('.pagination .next_page').attr('href')
if url && $(window).scrollTop() > $(document).height() - $(window).height() - 50
$('.loader').removeClass('hidden')
$.getScript(url)
$(window).scroll()
这是截屏
在这种情况下,如何防止rails重复记录?我尝试过uniq和其他几种方法都无济于事。
谢谢!
更新这里有一些可能有助于调试此问题的其他代码:
答案 0 :(得分:0)
要调试此问题,您必须查看它是javascript还是Rails问题
从调试中可以看出,您的浏览器向控制器发送了两个单独的请求,这表示您有某种javascript问题。但是,我遇到了Rails发送回"多个"之前的回应
解决问题的关键是确定导致问题的原因:
<强> JS 强>
如果这是一个JS问题,那么您可能会遇到两个潜在问题:
- Turbolinks
- 你的脚本开了两次
醇>
首先,我会确保Turbolinks在这里没有出现问题:
#app/assets/javascripts/application.js.coffee
#Paginate
paginate = ->
if $('.pagination').length
$(window).scroll ->
url = $('.pagination a.next_page').attr('href')
if url && $(window).scrollTop() > $(document).height() - $(window).height() - 50
$('.loader').removeClass('hidden')
$.getScript(url)
$(window).scroll()
$(document).on "page:load ready", paginate
这将确保每次加载时调用一次调用(它与Turbolinks Hooks绑定)。这意味着如果您想确保Turbolinks在部分重新加载页面后不会触发两次,它将会这样做。
其次,您希望确保只调用一次脚本。具体来说,我会研究这一行:
if url && $(window).scrollTop() > $(document).height() - $(window).height() - 50
确定脚本何时触发。您需要确保仅调用一次滚动,此行将确定。
-
<强>滑轨强>
第二个潜在的关注点是Rails。
如果你向Rails发送请求,你需要意识到,如果像Turbolinks这样的东西会阻碍,可能会发回多个回复
我会确保我的控制器设置如下:
#app/controllers/your_controller.rb
class YourController < ApplicationController
def your_action
...
respond_to do |format|
format.js
format.html
end
end
end
答案 1 :(得分:0)
确保您正在替换内容,而不是将另一组结果附加到.js.erb中的现有内容