0

我想在我的帖子中添加评论功能。我可以添加一次评论,无需重新加载即可渲染部分,但是当我添加另一个评论时,它只渲染部分(没有别的)这是我正在调用的创建方法:

  def create
    @comment = Comment.new(params[:comment])
    @snippet = @comment.snippet
    @comment.save
    @comment = Comment.new
    render :partial => "snippets/comment"
  end

Javascript:

$(document).ready( function(){
    save_comment();
});
function save_comment() {
    $("#new_comment").submit(function (e) {
        e.preventDefault();
        var url = "/comments/create";
        var post_data = $('#new_comment').serialize();
        logger(post_data);
        post_data = add_auth_token(post_data); // add authenticity token to post for forgery protection (works fine)
        $.post(url,
            post_data,
            function(data) {
                $("#comments_container").html(data);
                $("#comment_value").val("");
            });
    });
}

和形式

<%= form_for(@comment) do |f| %>
  <%= f.text_field :value %>
  <%= f.hidden_field :user_id, :value => current_user.id %>
  <%= f.hidden_field :snippet_id, :value => @snippet.id %>
  <div class="actions">
    <%= f.submit "Post" %>
  </div>
<% end %>
4

1 回答 1

1

由于 html 是在事件侦听器代码执行后添加的,因此无法为submit稍后在 DOM 中添加的元素附加事件处理程序。您需要使用on api 来绑定事件,它将附加一个委托事件处理程序,该处理程序可以处理来自后代元素的事件,这些事件稍后会添加到文档中。

在您的情况下,您需要将代码更改为:

$(document).ready( function(){
    save_comment();
});
function save_comment() {
    $(document).on("submit","#new_comment",function (e) {
        e.preventDefault();
        var url = "/comments/create";
        var post_data = $('#new_comment').serialize();
        logger(post_data);
        post_data = add_auth_token(post_data); // add authenticity token to post for forgery protection (works fine)
        $.post(url,
            post_data,
            function(data) {
                $("#comments_container").html(data);
                $("#comment_value").val("");
            });
    });
}
于 2012-04-15T11:51:34.833 回答