场景:帖子有很多评论。在帖子的索引页面中,当用户点击显示链接(link_to post)时,其评论将显示在帖子下方。
这里我使用append()添加注释:
$('#edit_post_<%= @post.id %>').append('<%= j render "comments/comments" %>')
因此,当用户点击显示链接时,评论将会加载并显示。
但是我怎么能再次隐藏这些评论(即发表评论)?
文章/索引
<h1>Posts</h1>
<% @posts.each do |post| %>
<%= form_for post, remote: true do |f| %>
<%= post.content %>
<div id="post_<%= post.id %>">
<%= link_to "show", post, remote: true %>
</div>
<% end %>
<% end %>
文章/ show.js.erb
$('#edit_post_<%= @post.id %>').append('<%= j render "comments/comments" %>')
评论/ _comments.html.erb
<% @comments.each do |comment| %>
<%= comment.content %>
<% end %>
答案 0 :(得分:1)
我想你没有新评论的事件绑定。
你应该使用像
这样的东西$('.container-of-your-comments').on('click', '.the-toggle-button', function (e) {
// toggle
});
所以切换适用于所有(也是未来的)元素。
修改强>
考虑到问题的变化:如果切换意味着只隐藏整个评论列表, 你必须手动完成。
我建议你有单独的显示/隐藏按钮(你可以在改变状态时显示和隐藏按钮),因为如果没有,它会变得更复杂。
例如,在posts / index中:
<h1>Posts</h1>
<% @posts.each do |post| %>
<%= form_for post, remote: true do |f| %>
<%= post.content %>
<div id="post_<%= post.id %>">
<%= link_to "show", post, remote: true %>
</div>
<div class="post-comments" id="post_comments_<%= post.id %>">
</div>
<% end %>
<% end %>
在comments / _comments.html.erb
中<% @comments.each do |comment| %>
<%= comment.content %>
<% end %>
<%= link_to "hide", '#', class: "hide-comments" %>
并在posts / show.js.erb
中$('#post_comments<%= @post.id %>').html('<%= j render "comments/comments" %>')
并在assets / javascripts / posts.js中(确保将其包含在您的application.js中)
$(document).ready(function() {
$('.hide-comments').click(function(e) {
e.preventDefault();
$(this).parent().hide();
});
});
backbone.js是一个很棒的工具,如果你要用这些评论做很多事情,比如CRUD等,你需要留在一个页面上 - 使用backbone.js。如果没有,坚持使用jQuery。