【问题标题】:How to have 2 chained ajax calls on the same form in Rails 3.2?如何在 Rails 3.2 中以相同的形式进行 2 个链式 ajax 调用?
【发布时间】:2014-08-08 23:58:59
【问题描述】:

新表单上有 2 个 id 字段(@module_info_id (id1) 和 @module_action_id (id2))。 id1 和 id2 都是带有 :collection 的下拉菜单。选择 id1 时,会根据 id1 的输入填充 id2。选择 id2 时,会根据 id2 的输入填充 2 个文本框。这是新的.js.erb:

<% if @module_info_id > 0 %>  #id1
  $('#user_access_module_action_id').empty();
  $('#user_access_module_action_id').append('<option value=""></option>');
  <% @module_actions.each do |r| %>
    $('#user_access_module_action_id').append('<option value="<%=r.id%>"><%= "##{r.id},"+ ' ' + "#{r.name}," + ' ' + "#{r.data_resource.name}" %></option>');
  <% end %> 
<% end %>
<% if @module_action_id > 0 %>  #id2
  <% module_action = OnboardDataUploadx.module_action_class.find_by_id(@module_action_id) %>
  $('#user_access_action').val('<%=module_action.name%>');
  $('#user_access_resource').val("<%=module_action.data_resource.name%>");
<% end %>

问题是当id2改变时,ajax会执行id1循环,去掉id2的选择。控制器没有 id1 的内存,也不知道 id1 是否改变。当 id2 更改时,将执行 id1 的循环。当 id2 改变时,有什么方法可以跳过 id1 的循环执行?

触发变化的jquery代码为:

$(function (){
    $('#user_access_engine_id').change(function(){
      $.get(window.location, $('form').serialize(), null, "script");
      return false;
    });
});

$(function() {
  $('#user_access_module_action_id').change(function (){
    $.get(window.location, $('form').serialize(), null, "script");
    return false;
  });
});

【问题讨论】:

    标签: javascript jquery ruby-on-rails ajax ruby-on-rails-3


    【解决方案1】:

    使用jquery填写第二个选择,以及选择的更改事件中的两个文本字段,如下所示:

    第一次选择更改时:

    $('#user_access_engine_id').change(function(){
      var val = this.val();
      if(val != null){
        $('#user_access_module_action_id').empty();
        $('#user_access_module_action_id').append('<option value=""></option>');
        <% @module_actions.each do |r| %>
          $('#user_access_module_action_id').append('<option value="<%=r.id%>">
    <%="##{r.id},"+ ' ' + "#{r.name}," + ' ' + "#{r.data_resource.name}" %></option>');
        <% end %>;
      }
      //refresh select related to its type
      //as example chosen-select as the following
      $('.chosen-select').trigger("chosen:updated");
    }
    

    当第二个选择改变时:

    $('#user_access_module_action_id').change(function (){
      var val = this.val();
      if(val != null){
        $('#user_access_module_action_id').append('<option value=""></option>');
      <% module_action = OnboardDataUploadx.module_action_class.find_by_id(@module_action_id) %>
        $('#user_access_action').val('<%=module_action.name%>');
        $('#user_access_resource').val("<%=module_action.data_resource.name%>");
      }
      //refresh select related to its type
    });
    

    【讨论】:

    • 非常有趣! .chanage(function) 在 form.js 文件中。我们可以在 .js 文件中使用 erb () 吗?
    • 另一个问题是 module_actions 是在 .change 触发后在控制器中计算的。如果将 module_actions 移到 .change 函数中,控制器中的代码将在 change 函数中的代码之后执行,因此 module_actions 将为 nil。这是真的吗?
    • Can't write () in .js file, but you can write (var ruby​​_code = ) in new.js.erb file, and used it in .js文件。例如:new.js.erb 中的 (var module_action_name = ),然后在 form.js 中将其用作 ($('#user_access_action').val(module_action_name);)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 2012-06-05
    • 2018-10-21
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    相关资源
    最近更新 更多