How can i show data using a modal when clicking a table row (using bootstrap)

前端 未结 3 1402
别跟我提以往
别跟我提以往 2020-12-12 18:58

I\'m sort of a beginner on the whole web development thing and after researching a lot i still couldn\'t get this done. Any help is very much appreciated. I\'m using latest

相关标签:
3条回答
  • 2020-12-12 19:17

    One thing you can do is get rid of all those onclick attributes and do it the right way with bootstrap. You don't need to open them manually; you can specify the trigger and even subscribe to events before the modal opens so that you can do your operations and populate data in it.

    I am just going to show as a static example which you can accommodate in your real world.

    On each of your <tr>'s add a data attribute for id (i.e. data-id) with the corresponding id value and specify a data-target, which is a selector you specify, so that when clicked, bootstrap will select that element as modal dialog and show it. And then you need to add another attribute data-toggle=modal to make this a trigger for modal.

      <tr data-toggle="modal" data-id="1" data-target="#orderModal">
                <td>1</td>
                <td>24234234</td>
                <td>A</td>
      </tr>
      <tr data-toggle="modal" data-id="2" data-target="#orderModal">
                <td>2</td>
                <td>24234234</td>
                <td>A</td>
            </tr>
      <tr data-toggle="modal" data-id="3" data-target="#orderModal">
                <td>3</td>
                <td>24234234</td>
                <td>A</td>
      </tr>
    

    And now in the javascript just set up the modal just once and event listen to its events so you can do your work.

    $(function(){
        $('#orderModal').modal({
            keyboard: true,
            backdrop: "static",
            show:false,
    
        }).on('show', function(){ //subscribe to show method
              var getIdFromRow = $(event.target).closest('tr').data('id'); //get the id from tr
            //make your ajax call populate items or what even you need
            $(this).find('#orderDetails').html($('<b> Order Id selected: ' + getIdFromRow  + '</b>'))
        });
    });
    

    Demo

    Do not use inline click attributes any more. Use event bindings instead with vanilla js or using jquery.

    Alternative ways here:

    Demo2 or Demo3

    0 讨论(0)
  • 2020-12-12 19:19

    The best practice is to ajax load the order information when click tr tag, and render the information html in $('#orderDetails') like this:

      $.get('the_get_order_info_url', { order_id: the_id_var }, function(data){
        $('#orderDetails').html(data);
      }, 'script')
    

    Alternatively, you can add class for each td that contains the order info, and use jQuery method $('.class').html(html_string) to insert specific order info into your #orderDetails BEFORE you show the modal, like:

      <% @restaurant.orders.each do |order| %>
      <!-- you should add more class and id attr to help control the DOM -->
      <tr id="order_<%= order.id %>" onclick="orderModal(<%= order.id  %>);">
        <td class="order_id"><%= order.id %></td>
        <td class="customer_id"><%= order.customer_id %></td>
        <td class="status"><%= order.status %></td>
      </tr>
      <% end %>
    

    js:

    function orderModal(order_id){
      var tr = $('#order_' + order_id);
      // get the current info in html table 
      var customer_id = tr.find('.customer_id');
      var status = tr.find('.status');
    
      // U should work on lines here:
      var info_to_insert = "order: " + order_id + ", customer: " + customer_id + " and status : " + status + ".";
      $('#orderDetails').html(info_to_insert);
    
      $('#orderModal').modal({
        keyboard: true,
        backdrop: "static"
      });
    };
    

    That's it. But I strongly recommend you to learn sth about ajax on Rails. It's pretty cool and efficient.

    0 讨论(0)
  • 2020-12-12 19:23

    The solution from PSL will not work in Firefox. FF accepts event only as a formal parameter. So you have to find another way to identify the selected row. My solution is something like this:

    ...
    $('#mySelector')
      .on('show.bs.modal', function(e) {
      var mid;
    
    
      if (navigator.userAgent.toLowerCase().indexOf('firefox') > -1) 
        mid = $(e.relatedTarget).data('id');
      else
        mid = $(event.target).closest('tr').data('id');
    
    ...
    
    0 讨论(0)
提交回复
热议问题