Недавно я реализовал бесконечную прокрутку страницы, как показано в сообщении в блоге. Итак, я показываю 10 сообщений на странице, когда пользователь достигает нижней части страницы, приложение запускает запрос "получить" к действию индекса, загружает еще 10 сообщений и добавляет их на страницу с помощью jquery.
Вот моя реализация:
post_controller
def index
if params[:tags]
@posts = Post.tagged_with(params[:tags]).paginate(:page => params[:page], :per_page => 10)
else
@posts = Post.paginate(:page => params[:page], :per_page => 10)
end
respond_to do |format|
format.html
format.js { render 'index.js.erb'}
end
end
index.js.erb
$('#posts').append('<%= escape_javascript(render @posts) %>');
$('a.load-more-posts').attr('href', '<%= posts_path page: @posts.next_page %>');
<% unless @posts.next_page %>
$('a.load-more-posts').remove();
<% end %>
Я сталкиваюсь с некоторыми проблемами при попытке фильтровать сообщения по тегу. Корневая проблема заключается в том, что один и тот же файл index.js.erb
запускается, когда пользователь вручную щелкает тег, чтобы видеть сообщения с этим тегом, а также бесконечную функцию прокрутки.
Когда кликнут новый тег, вместо того, чтобы сообщения просто добавлялись к существующему html, отображаемые сообщения сначала должны быть очищены, а затем новые записи должны быть добавлены.
С этого момента казалось очевидным, что я должен отделить действие индекса и отдельное действие posts_tagged_with
. У этого действия будет свой собственный js файл, который очень похож, но он заменит html, а не append.
Проблема заключается в том, что исходный index.js.erb
по-прежнему вызывается, когда пользователь прокручивает вниз, что добавляет сообщения из действия индекса.
Есть ли более эффективная реализация для этого?
В index.js.erb вы можете изменить свои первые две строки для этого:
$('#posts').<%= params[:tags] && params[:page].nil? ? "html" : "append" %>('<%= escape_javascript(render @posts) %>');
$('a.load-more-posts').attr('href', '<%= posts_path page: @posts.next_page, tags: params[:tags] %>');
Похоже, что лучшим способом было бы реализовать действие posts_tagged_with, чтобы вы могли отслеживать, какие теги выбраны, и endless_scroll, как обычно (используя append) с этими тегами. Затем, когда выбран другой тег, вы можете заменить содержимое новой коллекцией, используя метод jquery html.