40

私はウェブ開発全体の初心者のようなもので、多くの調査を行った後でも、これを成し遂げることができませんでした. どんな助けでも大歓迎です。最新の Rails バージョンとブートストラップを使用して、よりきれいにしています。

レストランからの注文を含むテーブルを含むページがあります。行をクリックすると、ブートストラップを使用してモーダル ウィンドウに注文の詳細が表示されます。onclick + javascript関数を使用してモーダルを開くことができましたが、見た目が少し乱雑で、モーダルのコンテンツdivに注文情報をロードする方法がまだわかりません。これが私が持っているコードです:

HTML:

<h1>Orders</h1>
<table class="table table-striped"
  <thead>
    <tr>
      <th>ID</th>
      <th>Customer</th>
      <th>Status</th>
    </tr>
  </thead>
  <tbody>
    <% @restaurant.orders.each do |order| %>
    <tr onclick="orderModal(<%= order.id  %>);">
      <td><%= order.id %></td>
      <td><%= order.customer_id %></td>
      <td><%= order.status %></td>
    </tr>
    <% end %>
  </tbody>
</table>

<div id="orderModal" class="modal hide fade" role="dialog" 
     aria-labelledby="orderModalLabel" aria-hidden="true">
  <div class="modal-header">
    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
    <h3>Order</h3>
  </div>
  <div id="orderDetails"class="modal-body"></div>
  
  <div id="orderItems" class="modal-body"></div>
  <div class="modal-footer">
    <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
  </div>
</div>

js:

function orderModal(order_id){
    $('#orderModal').modal({
        keyboard: true,
        backdrop: "static"
    });
};
4

3 に答える 3

49

できることの 1 つは、これらの onclick 属性をすべて取り除き、ブートストラップで正しい方法で行うことです。手動で開く必要はありません。トリガーを指定し、モーダルが開く前にイベントをサブスクライブして、操作を実行してデータを入力できるようにすることもできます。

現実の世界に適応できる静的な例として示します。

それぞれのに(つまり)<tr>のデータ属性を対応する id 値とともに追加し、指定したセレクターである を指定して、クリックすると、ブートストラップがその要素をモーダル ダイアログとして選択して表示します。そして、これをモーダルのトリガーにする別の属性を追加する必要があります。iddata-iddata-targetdata-toggle=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>

そして今、JavaScriptでモーダルを一度だけ設定し、イベントをリッスンして作業を行うことができます。

$(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>'))
    });
});

デモ

今後はインライン クリック属性を使用しないでください。バニラ js または jquery を使用して、代わりにイベント バインディングを使用します。

ここで別の方法:

デモ 2またはデモ 3

于 2013-09-25T03:41:21.837 に答える
10

PSL のソリューションは Firefox では機能しません。FF は、イベントを仮パラメーターとしてのみ受け入れます。したがって、選択した行を識別する別の方法を見つける必要があります。私の解決策は次のようなものです:

...
$('#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');

...
于 2015-02-14T18:22:42.093 に答える
3

ベスト プラクティスは、tr タグをクリックしたときに注文情報を ajax で読み込み、次のように $('#orderDetails') で情報 html をレンダリングすることです。

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

または、注文情報を含む各 td のクラスを追加し、jQuery メソッド $('.class').html(html_string) を使用して、モーダルを表示する前に特定の注文情報を #orderDetails に挿入することもできます。

  <% @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"
  });
};

それでおしまい。しかし、Rails の ajax について学ぶことを強くお勧めします。それはかなりクールで効率的です。

于 2013-09-25T03:16:05.977 に答える