したがって、次の JavaScript コードがあります。ユーザーがページ上のボタンをクリックすると、データ属性から「name」と「stepId」が読み取られ、Twitter ブートストラップ モーダル ダイアログが開きます。ダイアログで [クリア] ボタンをクリックすると、提供されたコールバックが起動されます。
これは、初めて呼び出されたときにうまく機能します。問題は、その後のすべての呼び出しで、[クリア] ボタンをクリックすると、コールバックが 2 回発生することです。最初のコールバックではstepId
、最初の呼び出しからの が表示され、2 番目のコールバックではstepId
、現在の呼び出しからの が表示されます。
clearInputTargetName
ダイアログでclearInputName
は常に正しい値です。
var Dialog = function (dlgId)
{
var okCallback = null;
var show = function (cb)
{
okCallback = cb;
jQuery.noConflict();
$(dlgId).modal("show");
};
var hide = function ()
{
jQuery.noConflict();
$(dlgId).modal("hide");
};
var onOK = function ()
{
okCallback();
};
var init = function ()
{
$(dlgId + " .okButton").off('click').on('click', function ()
{
onOK(true);
hide();
});
};
init();
return {
show: show,
hide: hide,
init: init
};
};
var ClearInputDialog = function ()
{
var show = function (input, cb)
{
var dlg = new Dialog("#clearInputDialog", input);
$("#clearInputTargetName").text(input);
$("#clearInputName").text(input);
dlg.show(function ()
{
cb(true);
dlg.hide();
});
};
return { show: show };
};
var WorkflowDesignerVM = function ()
{
var clearInput = function ()
{
var name = $(this).attr("data-input");
var stepId = $(this).attr("data-stepid");
var dlg = new ClearInputDialog();
dlg.show(name, function (result)
{
alert('clearing stepId: ' + stepId);
});
};
var init = function ()
{
$(document).on("click", ".clear-input", clearInput);
};
init();
};
var vm = new WorkflowDesignerVM();
モーダル ダイアログは次のようになります。
<div id="clearInputDialog" class="modal fade">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h4 class="modal-title">Clear Input for <span id="clearInputTargetName">[clearInputTargetName]</span></h4>
</div>
<div class="modal-body">
Are you sure you want to clear <span id="clearInputName">[clearInputName]</span>?
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default cancelButton" data-dismiss="modal">Close</button>
<button type="button" id="clearInputButton" class="btn btn-primary okButton" data-stepid="" data-input="">Clear</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
私のjQueryイベントハンドラーコードと関係があると感じています。Dialog.init を次のコードに変更すると、常に 1 つのコールバックが取得されますが、最初の呼び出しからの stepId が常に表示されます。
var init = function ()
{
$(dlgId + " .okButton").on('click', function ()
{
onOK(true);
hide();
$(dlgId + " .okButton").off('click');
});
};