Javascript 如何使用每个ajax请求更新实例变量?

Javascript 如何使用每个ajax请求更新实例变量?,javascript,jquery,ruby-on-rails,ajax,instance-variables,Javascript,Jquery,Ruby On Rails,Ajax,Instance Variables,我在模型页面的视图上有一长段评论。我没有在页面加载时显示所有评论,而是尝试创建一个查看更多按钮,显示接下来的十条评论。该按钮向控制器发送ajax请求,然后控制器使用jquery呈现该块: _查看_more.html.erb pages\u controller.rb 查看更多 我将使用haml和咖啡脚本 呈现注释时,您会放置一个带有注释id的html5数据属性: 评论不完整 #comments/_comment.html.haml %p.single-comment{:"data-comment

我在模型页面的视图上有一长段评论。我没有在页面加载时显示所有评论,而是尝试创建一个查看更多按钮,显示接下来的十条评论。该按钮向控制器发送ajax请求,然后控制器使用jquery呈现该块:

_查看_more.html.erb

pages\u controller.rb

查看更多

我将使用haml和咖啡脚本

呈现注释时,您会放置一个带有注释id的html5数据属性:

评论不完整

#comments/_comment.html.haml
%p.single-comment{:"data-commentid" => comment.id}
  =comment.body
咖啡

$ ->
  $("#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
评论/查看_more.js.erb

$("#comments-wrapper").append("<%= escape_javascript(render @comments) %>");

注意:我不知道您的路由是如何设置的,因此我将page.id作为数据属性

我将使用已经实现的分页gems或。我将使用will_paginate创建这个示例

首先,必须指出您的方法是不正确的,因为它会在每个视图或更多请求中加载所有注释。若你们想显示10条评论,只从数据库中选择它们是有意义的,对吗?分页宝石会帮你的

让我们来看看代码:

查看更多按钮

_查看_more.html.erb

查看_more.js.erb

$("#comments-wrapper").append("<%= escape_javascript(render @comments) %>");

在使用count.进行ajax调用之前更新隐藏变量不好吗

var currentVal = parseInt($("[type=hidden]").val());
$("[type=hidden]").val( currentVal + 1 );
在注释部分的开头添加隐藏字段,默认值为0

<input type="hidden" name="hiddenId" id="hiddenId" value="0">

希望它能帮助你

如果你想要一个快速而肮脏的方法,你可以将开始号和结束号保存在一个文件夹中


但是跟踪客户端接下来需要呈现的内容将是一件正确的事情。

我知道这并不能回答您的问题,但您确定您不想只跟踪客户端,并在必要时通过ajax请求发送开始索引和结束索引吗?@JMM我没有考虑过这一点。我怎么能这么做?这真的足够了吗?它似乎太简单,无法实际工作。例如,我如何选择每页返回多少条记录?@JoeMorano,您需要安装de will_paginate gem当我按下按钮时不会发生任何情况。我需要在某个地方需要一个文件才能让gem工作吗?不需要@JoeMorano。当您按下按钮时,会发出AJAX请求吗?
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-wrapper").append("<%= escape_javascript(render @comments) %>");
<%= link_to "view more", view_more_page_path, remote: true, id: 'view-more-btn' %>
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
<% @comments.each do |comment| %>
  <%= comment.text %>
<% end %>
$("#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) %>')
var currentVal = parseInt($("[type=hidden]").val());
$("[type=hidden]").val( currentVal + 1 );
<input type="hidden" name="hiddenId" id="hiddenId" value="0">