bootstrapのmodalダイアログオープン時に引数を渡したい。
ダイアログのタイトルだとか内容のテキストだとかを
設定してからオープンさせたい場合、jqueryとかでidを強引に書き換えてやれば
いいのだが、それだと密結合な感じになってしまうので、イベントを駆使していろいろ頑張ってみた。
まず、ダイアログ側、こんな感じでdivタグがかかれている。
<div class="modal hide" id="myModal"> <div class="modal-header"> <a class="close" data-dismiss="modal">×</a> <span id="modalHead">Modal header</span> </div> <div class="modal-body"> <span id="modalBody">One fine body</span> </div> <div class="modal-footer"> <a href="#" class="btn" data-dismiss="modal">Close</a> <a href="#" class="btn btn-primary" data-dismiss="modal">Save changes</a> </div> </div>
上の、modalHeader部分とmodalBody部分を引数を渡して
好きな形で設定できるようにしたい場合、
まず、initializeイベントというカスタムイベントをmyModalエレメントに
設定してあげる。
initializeイベントにはhead、bodyというプロパティを持つオブジェクトが引数として渡される。
<script type="text/javascript"> $(function(){ $('#myModal').on('initialize',function(event,initObj){ $('#modalHead').text(initObj.head); $('#modalBody').text(initObj.body); }); }); </script>
bootstrapのモーダルダイアログには表示されたとき、隠されたとき等のイベントが
設定されており、それらが呼ばれたときのコールバック関数等を設定できる。
それを利用して、表示された時に上記のinitializeイベントをトリガーする処理を書けば
引数を設定してダイアログが呼ばれるという寸法になる。ここでは
showというイベント発生時に、headText,bodyTextというidのテキストボックスから
ダイアログのタイトル、内容を設定してダイアログを表示させている。
<script type="text/javascript"> $(function(){ $('#myModal').on('show',function(){ var initObj = { head: $('#headText').val(), body: $('#bodyText').val() }; $('#myModal').trigger('initialize',[initObj]); }); }); </script>
このやり方だと、呼び出し元の画面はmodalHeadやmodalBodyといった
ダイアログ側のIDを知らずに、javascriptのデータとしてダイアログのタイトルや
内容を渡せるのでゴリゴリ書くよりは多少は疎結合になるはず。
(少なくとも同じダイアログ画面をいろんな場所で使っていて、IDが変わってしまった時などは
ダイアログ側だけ直せば良いと言う形になる。)