如何使用每个ajax请求更新实例变量
How can I update an instance variable with each ajax request?
我对模型Page
的视图有一长串注释。我尝试创建一个"查看更多"按钮来显示接下来的十条评论,而不是在页面加载时显示所有评论。该按钮向控制器发送一个ajax请求,然后控制器使用jquery:呈现该块
_view_more.html.erb
<% comments.each_with_index do |comment, index|%>
<% if (( index > @start_number) && (index < @end_number) ) %>
<%= comment.text %>
<% end %>
比方说,我总是想展示接下来的10条评论。我只想设置@start_number = @start_number + 10
和@end_number = @end_number + 10
在控制器中,但实例变量被重置,因此@start_number
将为零。如何设置一个在每次ajax请求时增加10的变量?
"查看更多"按钮
<%= link_to "view more", view_more_page_path, remote: true %>
pages_controller.rb
def view_more
@page = Page.find(params[:id])
respond_to do |format|
format.html { redirect_to root_path }
format.js
end
end
view_more
$("#comments-body").append("<%= escape_javascript(render 'view_more') %>");
我将使用haml
和coffee-script
渲染comments
时,将html5
data attribute
与comment
:的id
放在一起
#view where to render comments
%div#comments-wrapper{:"data-pageid" => @page.id}
=render @comments
=link_to "View more", "#", id: "view-more-link"
评论部分
#comments/_comment.html.haml
%p.single-comment{:"data-commentid" => comment.id}
=comment.body
application.coffee
$ ->
$("#view-more-link").on 'click', ->
last_comment_id = $("#comments-wrapper .single-comment").last().data('commentid')
page_id = $("#comments-wrapper").data("pageid")
$.ajax
url: "/comments/view_more"
dataType: "script"
data:
last_comment_id: last_comment_id
page_id: page_id
注释_控制器
def view_more
@page = Page.find(params[:pageid])
if params[:last_comment_id]
@comments = @page.comments.where("comments.id > ?", params[:last_comment_id]).limit(10)
end
respond_to do |format|
format.js
end
end
comments/view_more.js.erb
$("#comments-wrapper").append("<%= escape_javascript(render @comments) %>");
注意:我不知道你的路线是如何设置的,所以我把page.id
作为数据属性以及
我会使用已经实现的分页宝石kaminari或will_pagenate。我将使用will_page创建这个示例。
首先,必须指出您的方法是不正确的,因为它会在每个view_more
请求中加载所有注释。如果你想显示10条评论,那么从数据库中只选择它们是有意义的,对吧?分页宝石会为你做的!
让我们来看看代码:
"查看更多"按钮
<%= link_to "view more", view_more_page_path, remote: true, id: 'view-more-btn' %>
pages_controller.rb
def view_more
@comments = Page.find(params[:id]).comments.paginate(page: params[:page], per_page: 10)
respond_to do |format|
format.html { redirect_to root_path }
format.js
end
end
_view_more.html.erb
<% @comments.each do |comment| %>
<%= comment.text %>
<% end %>
view_more.js.erb
$("#comments-wrapper").append("<%= escape_javascript(render 'view_more') %>");
# We need to update the 'view more' link with the next page number
$('#view-more-btn').attr('href', '<%= view_more_page_path((params[:page] || 0) + 1) %>')
在使用count..进行ajax调用之前更新隐藏变量不是很好吗。。?
var currentVal = parseInt($("[type=hidden]").val());
$("[type=hidden]").val( currentVal + 1 );
在注释部分的开头添加隐藏字段,默认值为"0"
<input type="hidden" name="hiddenId" id="hiddenId" value="0">
希望它能帮助
如果您想要一种快速而肮脏的方法,可以将start_number和end_number保存在cookie中。
但是,跟踪客户端下一步需要呈现的内容是正确的做法
- 从Sequelize中的非实例更新
- 更新Redux状态&然后在同一实例中获取更新状态
- 使用 JavaScript 中的实例更新原型
- 如何使用每个ajax请求更新实例变量
- 原型值不会针对 js 中的每个实例更新,为什么
- 在 PHP 中,当同一页面的其他实例更改时,更新页面
- 运行 AJAX 函数的多个实例 - 仅第二个实例更新
- 如何允许 ActiveX 对象在 JavaScript 中实例化之前安装更新的版本
- 按需更新许多 Highcharts 实例的最佳性能
- Angularjs - 更新同一控制器的多个实例
- 获取所有实例化的javascript对象并更新值
- Javascript PHP更新所有打开的实例,如Facebook
- 如何更新表示相同数据的两个不同React组件实例
- 在保存新的模型实例之后,在Ember.js中转换到路由之前,更新资源模型
- 更新CKEditor'在实例已经创建之后,通过JavaScript创建的CSS
- 如何使用jquery隐藏/更新/显示具有相同ID的多个实例
- 添加新的行实例,无法更新单元格原始值
- 更新现有HandsOnTable实例的设置
- 如何用原型函数更新实例属性,并从另一个函数访问它
- Django:通过web界面同时更新多个模型实例的最好方法是什么?