【问题标题】:Rails form - change select options based on another selected option through JavaScriptRails 表单 - 通过 JavaScript 根据另一个选定选项更改选择选项
【发布时间】:2021-12-16 22:52:12
【问题描述】:

我正在寻找一种方法来更改 rails form.select 字段中的选项,该方法基于另一个选择字段的选定选项。

我之前尝试这样做的方法是使用具有相同对象和不同选项集的两个单独字段,如下所示:

<%= form_with(model: my_model) do |form| %>

  <div class="form-floating" id="input">
    <%= form.select :input, ['a', 'b'], { }, class: "form-control" %>
    <%= form.label :input %>
  </div>

  <div class="form-floating" id="output1">
    <%= form.select :output, ['c', 'd'], { }, class: "form-control" %>
    <%= form.label :output %>
  </div>

  <div class="form-floating" id="output2">
    <%= form.select :output, ['e', 'f'], { }, class: "form-control" %>
    <%= form.label :output %>
  </div>

  <script>
    function onChange() {
      var selected = $('#input option:selected').text()
      if (selected == 'a') {
        $('#output1').show()
        $('#output2').hide()
      }
      if (selected == 'b') {
        $('#output1').hide()
        $('#output2').show()
      }
    }

    $('#input').change(onChange)
    $(window).on("turbolinks:load", onChange)
  </script>

  <%= form.submit class: "btn" %>
<% end %>

这种方法的问题是:output字段被创建了两次并且只提交了最后一个(id="output2"),所以我现在正在寻找一种方法来改变onChange中的选择选项() 方法用于单个输出 form.select 字段。

非常感谢您对此问题的任何帮助或替代解决方案,干杯。

【问题讨论】:

    标签: javascript html jquery ruby-on-rails


    【解决方案1】:

    解决了这个问题,在这里发布给其他有这个问题的人。 基本上我放弃了 rails 表单助手,转而使用标签构建 html 字符串,如下所示:

    function replaceHTML() {
        var newHTML = '<select class="form-control" name="output" id="output">'
    
        var selection = $('#input option:selected').text()
        var options = selection == 'a' ? ['c', 'd'] : ['e', 'f']
        for (let i = 0; i < options.length; i++) {
          newHTML += '<option value=' + options[i] + '>' + options[i] + '</option>'
        }
    
        newHTML += '</select><label for="output">Output</label>'
        $('#output').html(newHTML)
      }
    

    【讨论】:

      【解决方案2】:

      简答:使用$('#output-')prop('disabled', true); 而不是.hide()

      长答案:

      根据JQuery docs.hide() 实际上并没有禁用输入,它只是用 CSS 隐藏它。与.show()looks like 相同。所以你需要为此使用不同的方法。稍后会详细介绍。

      其次,之所以只发送第二个选择框output2,可能是因为它们都设置为&lt;%= form.select :output %&gt;。根据Rails docs 的说法,在后台,Rails 将这两个输入设置如下:

      <select name="output"></select>
      

      由于您有两个具有相同name 属性的选择框,因此它们会相互覆盖。这又是因为您使用的是.hide().show(),所以它们实际上并没有被禁用。

      我认为这适用于您的场景。尝试像这样使用$("output").prop('disabled', true);

        function onChange() {
            var selected = $('#input option:selected').text()
            if (selected == 'a') {
              $('#output1').show()
              $('#output2').prop('disabled', true);
            }
            if (selected == 'b') {
              $('#output1').prop('disabled', true);
              $('#output2').show()
            }
          }
      

      如果您使用的是 Stack Overflow Answer 使用 $("input").attr('disabled','disabled');

      【讨论】:

      • 您好,感谢您的回复,不幸的是,禁用该字段似乎不起作用,只是继续从 output2 提交选择。是否认为有一种方法只有一个输出选择字段,并从 JavaScript 代码填充选项列表,关于如何做到这一点的任何想法?
      • 嗯。您可以尝试决定要默认哪个,然后在页面加载时,只需通过 JS 自动禁用另一个,并仅在您选择某个选项时重新启用它。然后在事情发生正常变化时禁用/重新启用。
      • 对于通过 JQuery 填充选择框,这可能会变得非常棘手。看起来this SO answer 做到了。但是,尝试管理您禁用/启用的两个选择框的第一个计划可能是最佳实践 - 当您在 6 个月后查看代码时,它肯定是最易读的 lol
      • 是的,在它在“turbolinks:load”上调用 onChange() 的原始方法中,尝试了几次将“禁用”属性设置为 true 和 false 的迭代,但似乎不会影响提交的变量.
      猜你喜欢
      • 1970-01-01
      • 2020-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-25
      相关资源
      最近更新 更多