【问题标题】:Bootstrap 3 Form Modal while in loopBootstrap 3 Form Modal while in loop
【发布时间】:2014-03-17 10:36:55
【问题描述】:

我认为有这个循环:

<% @item.inventory_items.each do |p| %>

我在上面的do 块中为每个inventory_item 循环了这个表单:

<%= form_for(@list_item) do |f| %>
             <%= f.hidden_field :upc, :value => @item.upc %>
             <%= f.hidden_field :inventory_item_id, :value => p.id %> 

             <%= f.select :shopping_list_id, options_for_select(ShoppingList.options_for_list(current_user.shopping_lists)), {}, :class => "form-control" %>
             <%= f.submit("Add It!", class: "btn btn-add") %>
<% end %>

我现在已将此表单放入 Bootstrap 3 模式中。为简洁起见,我不会发布整个模式。这是触发器,它为每个inventory_item 循环:

<button class="btn btn-primary btn-lg" data-toggle="modal" data-target="#formModal">Add To List</button>

我遇到的问题是我的表单使用来自循环的inventory_items 的属性来填充此表单中的隐藏字段之一。所以这是我的问题:

当它被触发时,如何将这个变量从循环传递到模态?

编辑

这是我目前的模式:

<div class="modal fade" id="addListItem" tableindex="-1" role="dialog" aria-labelledby="addListItem" aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
          <h4 class="modal-title" id="form-label">Add this item to a shopping list.</h4>
      </div>

      <div class="modal-body">
         <%= form_for(@list_item) do |f| %>
             <%= f.hidden_field :upc, :value => @item.upc %>
             <%= f.hidden_field :inventory_item_id, :id => "inventory-item-id" %> 

             <%= f.select :shopping_list_id, options_for_select(ShoppingList.options_for_list(current_user.shopping_lists)), {}, :class => "form-control" %>
             <%= f.submit("Add It!", class: "btn btn-add") %>
         <% end %>
      </div>

      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
      </div>

    </div>     
  </div> 
</div>

来自@David Antaramian 的自定义 .js:

$('button,[data-inventory-item-id]').click(function() {
    var inventoryID = $(this).data('inventory-item-id');
    $('#inventoryID').prop('value', inventoryID);
    $('#addListItem').modal('show');
});

【问题讨论】:

  • 我不明白你代码中的循环。我假设您正在尝试做的是使用您创建的“添加到列表”按钮来激活包含单个inventory_item 表单的模式,此时用户可以选择哪个ShoppingList 来保存该项目。我想掌握的是:form_for 循环是@item-do-p 循环的子语句吗?还是分开的?每种形式是否有单独的模态,还是全部定义在一个大模态中?
  • 对不起,我应该澄清一下。 form_for@item-do-p 循环的子语句。我只有一个模式,我希望它可以从循环中填充正确的隐藏字段属性,这取决于选择了哪个 inventory_item 按钮。你对我最终目标的假设是正确的。这样就清楚了吗?
  • 编辑了我的问题以澄清。
  • 是的,这一切都清楚了。我正在尝试仅使用单个模态对话框来完成此操作的方法。
  • 我认为这些 SO 线程很相似,应该对您有所帮助:stackoverflow.com/a/20724640/1422070stackoverflow.com/a/10635652/1422070

标签: javascript ruby-on-rails forms twitter-bootstrap


【解决方案1】:

就目前而言,我认为您不应该在@item-do-p 循环内执行form_for。模式需要填充表单以将单个项目保存到ShoppingList,但为了做到这一点,它必须具有inventory_item_id。除了输入元素之外,表单本身具有相同的数据属性。

为了实现这一点,我将使用 jQuery 和自定义数据属性。在视图文件中,我有以下代码:

<div class="modal fade" id="addListItem">
    <div class="modal-dialog">
        <div class="model-content">
            <div class="modal-header">
                <button class="close" data-dismiss="modal">&times;</button>
            </div>
            <div class="modal-body">
                    <%= form_for(@list_item) do |f| %>
                        <%= f.hidden_field :upc, :value => @item.upc %>
                        <%= f.hidden_field :inventory_item_id, :id => "inventory-item-id" %> 
                        <%= f.select :shopping_list_id, options_for_select(ShoppingList.options_for_list(current_user.shopping_lists)), {}, :class => "form-control" %>
                        <%= f.submit("Add It!", class: "btn btn-add") %>
                    <% end %>
            </div>
        </div>
    </div>
</div>

<div class="container">
    <% @item.inventory_items.each do |p| %>
        <div class="row">
            <div class="col-md-8">
                <%= p.name %>
            </div>
            <div class="col-md-4">
                <button class="btn btn-primary btn-lg" data-inventory-id="<%= p.id %>">Add To List</button>
            </div>
        </div>
    <% end %>
</div>

在特定于控制器的 JavaScript 资产文件中,添加以下代码:

$(document).ready(function() {
    $('button,[data-inventory-id]').click(function() {
        var inventoryID = $(this).data('inventory-id');
        $('#inventoryID').prop('value', inventoryID);
        $('#addListItem').modal('show');
    });
});

模式中有一种形式。在容器中,@item 中的每个库存项目都有重复行。 “添加到列表”按钮现在有一个自定义数据标签data-inventory-id,它是从@item-do-p 循环中设置的。此标签指定我们要添加到 ShoppingList 的库存项目。

JavaScript 代码首先选择所有既是button 元素又具有data-inventory-id 属性的元素。它在所有这些上注册了一个click() 侦听器。单击其中一个时,它会获取该项目的库存ID,将其分配给表单中的库存ID隐藏字段,然后显示表单。

如果我误解了您的意图,请告诉我。

【讨论】:

  • 这正是我想要做的。我对您的答案进行了一些更改(将“inventory-id”更改为“inventory-item-id”)。出于某种原因,模式没有响应按钮点击。我不是很能干js,所以我可能把js文件放错了地方。我在views/items/show.js 有它。我需要将它包含在某个地方吗?谢谢!
  • 那是我将其称为“视图特定”文件的错误。它应该在特定于控制器的 JavaScript 资产文件中,在您的情况下,它很可能是 app/assets/javascripts/items.js.coffee。我是用 JavaScript 写的,所以你应该把扩展名改为 .js。资产管道处理将其连接到主 application.js 文件中,默认情况下该文件应包含在您的布局中。您可以包含特定于控制器的内容,但这需要配置。进一步查看RailsGuides: The Asset Pipeline
  • 我明白了。我继续按照建议做了。我仍然没有从按钮点击中得到任何响应。正如我所说,我对 js 的能力不是很强,所以在解决这个问题时我有点茫然。有什么想法吗?
  • 您的控制台是否出现错误?使用 Chrome,您可以通过单击查看 -> 开发人员 -> JavaScript 控制台来启动控制台。使用 Firefox:工具 -> 开发人员 -> Web 控制台。控制台应该记录任何 JavaScript 错误。如果单击按钮时没有发生错误,则 .click() 事件回调未正确指定。充当回调的匿名函数依赖于 ID 属性为addListItem 的模态(即divmodal)和ID 属性为inventoryID 的目标隐藏字段。
  • 在控制台中没有收到任何错误。我已经用完整的模态和我的 js 文件更新了我的问题。我找不到任何明显的错误,你看到什么了吗?
【解决方案2】:

在上面的 edward 指出这个帖子之后,我能够调整一些东西以与 rails 一起工作:Passing data to a bootstrap modal

按钮触发器:

<%= content_tag "button", class: "btn btn-default btn-lg addbtn", data: {id: "#{p.id}", toggle: "modal", target: "#addListItem"} do %>
          Add To List
<% end %>

模态:

<div class="modal fade" id="addListItem" tableindex="-1" role="dialog" aria-labelledby="addListItem" aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
          <h4 class="modal-title" id="form-label">Add this item to a shopping list.</h4>
      </div>

      <div class="modal-body">
         <%= form_for(@list_item) do |f| %>
             <%= f.hidden_field :upc, :value => @item.upc %>
             <%= f.hidden_field :inventory_item_id, :id => "inventoryID", :value => "" %> 

             <%= f.select :shopping_list_id, options_for_select(ShoppingList.options_for_list(current_user.shopping_lists)), {}, :class => "form-control" %>
             <%= f.submit("Add It!", class: "btn btn-add") %>
         <% end %>
      </div>

      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
      </div>

    </div>     
  </div> 
</div>

JS:

$(document).on("click", ".addbtn", function() {
        var inventoryID = $(this).data('id');
        $("#inventoryID").val(inventoryID);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 2022-12-02
    • 1970-01-01
    • 2022-12-27
    • 2020-08-16
    相关资源
    最近更新 更多