使用 Ajax 的表单要么只能使用一次,要么在刷新之前不会更新
form with ajax either only usable once or doesn't update until refresh
我正在尝试使用 javascript 更新内置 rails 的 wiki 应用程序上的协作者表,从同一页面上的另一个现有用户表添加他们。最初,当我添加协作者时,协作者创建操作只会运行一次,我必须刷新页面才能添加另一个。我尝试将 .ajax(cache:false( 添加到我的 javascript 中,现在我可以在不刷新的情况下添加多个协作者,但它们不会显示在协作者表上或从用户列表中消失,直到我刷新页面。
这是我的javascript:
<% if @collaborator.valid? %>
$('.js-collaborators').html("<%= escape_javascript(render partial: 'collaborators/collaborator') %>").ajax(cache: false);
$('.new-collaborator').html("<%= escape_javascript(render partial: 'collaborators/users', locals: { wiki: @wiki }) %>").ajax(cache: false);
<% else %>
$('.new-collaborator').html("<%= escape_javascript(render partial: 'collaborators/users', locals: { wiki: @wiki }) %>").ajax(cache: false);
<% end %>`
协作者部分:
<table class="table table-striped" style="width:75%">
<tr>
</tr>
<% @wiki.collaborators.each do |collaborator| %>
<tr>
<% user = User.find(collaborator.user_id) %>
<td><%= user.user_name %></td>
<td>
<%= link_to 'Remove', [@wiki, collaborator], method: :delete, class: 'btn btn-xs btn-danger', remote: true %>
</td>
</tr>
<% end %>
</table>
用户部分:
<table class="table table-striped" style="width:75%">
<% User.all.each do |user| %>
<% if !@wiki.collaborators.pluck(:user_id).include?(user.id) %>
<%= form_for [@wiki, @wiki.collaborators.build], remote: true do |f| %>
<tr>
<td><%= user.user_name %></td>
<td>
<%= f.hidden_field :user_id, :value => user.id %>
<%= f.submit 'Add', class: 'btn btn-xs btn-success', method: :create %>
<% end %>
</td>
</tr>
<% end %>
<% end %>
</table>
维基显示页面的相关部分:
<div class="js-collaborators">
<%= render partial: 'collaborators/collaborator', locals: {wiki: @wiki} %>
</div>
<button type="button" class="btn btn-sm btn-info" data-toggle="collapse" data-target="#add-collaborators">Add Collaborators</button>
<div id="add-collaborators" class="new-collaborator collapse" >
<%= render partial: 'collaborators/users', locals: {wiki: @wiki} %>
</div>
我猜将缓存设置为 false 并不是解决需要刷新页面以添加另一个协作者的初始问题的理想方法,但我不确定还能尝试什么。我对rails和javascript都很陌生。谢谢!
编辑:我将我的javascript更改为使用.reset((而不是.ajax(cache:false(。这样,我的协作者列表会正确更新,但用户列表不会。以下是更新的 javascript:
<% if @collaborator.valid? %>
$('.js-collaborators').html("<%= escape_javascript(render partial: 'collaborators/collaborator') %>").reset();
$('.new-collaborator').html("<%= escape_javascript(render partial: 'collaborators/users') %>").reset();
<% else %>
$('.new-collaborator').html("<%= escape_javascript(render partial: 'collaborators/users') %>").reset();
<% end %>
我能够通过向用户表中的行添加一个 ID 来解决此问题,并在将用户添加为协作者而不是重新渲染部分时让我的 javascript 隐藏该行。
新的JavaScript:
<% if @collaborator.valid? %>
$('#user-' +<%= @collaborator.user_id %>).hide();
$('.js-collaborators').html("<%= escape_javascript(render partial: 'collaborators/collaborator') %>").reset();
<% else %>
$('.new-collaborator').html("<%= escape_javascript(render partial: 'collaborators/users') %>").reset();
<% end %>
新用户表:
<table class="table table-striped" style="width:75%">
<% User.all.each do |user| %>
<% if !@wiki.collaborators.pluck(:user_id).include?(user.id) %>
<%= form_for [@wiki, @wiki.collaborators.build], remote: true do |f| %>
<tr id='user-<%=user.id%>' >
<td><%= user.user_name %></td>
<td>
<%= f.hidden_field :user_id, :value => user.id %>
<%= f.submit 'Add', class: 'btn btn-xs btn-success', method: :create %>
<% end %>
</td>
</tr>
<% end %>
<% end %>
</table>
相关文章:
- 只有当选项卡/窗口有焦点时,页面才能每5秒刷新一次
- 将图像从本地存储加载到画布仅每秒刷新一次
- 使用年、月、日期、小时、秒格式每分钟刷新一次图像
- 对于特定的URL,每5秒刷新一次表
- 仅当图像完全可用时,每秒刷新一次图像
- 如何制作每 10 秒刷新一次的 jquery 表
- Javascript - 如何从文件加载变量并每 3 秒刷新一次
- 每秒刷新一次集合
- Chrome 扩展程序,每分钟刷新一次页面,并在每次刷新时运行 (javascript) 脚本
- 数据表每 30 秒自动刷新一次不起作用
- Javascript刷新一次而不使用主题标签
- 每 5 秒刷新一次 JSON 填充图表的内容
- 我只想让我的页面刷新一次
- 然后,Jquery 加载内容每 2 秒刷新一次
- GWT 如何每 5 分钟自动刷新一次页面,而无需单击按钮
- 每x秒自动刷新一次Html表
- php值每10秒刷新一次,但我希望它能随页面立即加载
- DIV 只应刷新一次
- 每x秒刷新一次DIV内容,无需永久页面
- 执行javascript,然后每60秒刷新一次脚本