场景:列表行每行都有删除按钮,点击删除按钮将行记录的id传给js方法,js方法中调用amazeui的confirm控件,确认删除function通过ajax执行删除行为。
问题现象:每次删除列表第一行有效,第二行以后删除时后台总是拿到第一次删除时传递的id。
原因分析:“出于性能考虑,每个 Modal 实例都存储在对应元素的 $('.am-modal').data('amui.modal')
属性中,onConfirm
/onCancel
会保存第一次运行 Modal 时候的数据,导致在某些场景不能按照预期工作”。
官方给出了四个解决方案,但是没有具体示例:
可以选择的处理方式:
- 法一:通过
relatedTarget
这个钩子获取数据,如上面的演示,以该元素为桥梁获取想要的数据(2.1 开始支持); - 法二:按照这种方式 每次都重新给这两个参数赋值;
- 法三:Confirm 关闭后移除暂存的实例,再次调用时重新初始化;
$('#your-confirm').on('closed.modal.amui', function() {
$(this).removeData('amui.modal');
});
- 法四: 重写
cancel
/confirm
按钮的事件处理函数。
$(function() {
var $confirm = $('#your-confirm');
var $confirmBtn = $confirm.find('[data-am-modal-confirm]');
var $cancelBtn = $confirm.find('[data-am-modal-cancel]');
$confirmBtn.off('click.confirm.modal.amui').on('click', function() {
// do something
});
$cancelBtn.off('click.cancel.modal.amui').on('click', function() {
// do something
});
});
法二、三以牺牲性能为代价,不推荐;如果要使用法四,可以不添加两个按钮的 data-am-modal-xx
属性,免去解绑默认事件的步奏。
自己的示例解决办法:
1 function deleteFunc(theId) { 2 var $confirm = $('#my-confirm'); 3 var confirm = $confirm.data('amui.modal'); 4 5 var onCancel = function() { 6 }; 7 var onConfirm = function() { 8 var url = '../admin/delete?t=' + Math.random(); 9 $.ajax({ 10 type : 'post', 11 url : url, 12 cache : false, 13 data : JSON.stringify({ 14 'id' : theId 15 }), 16 contentType : 'application/json', 17 dataType : 'json', 18 success : function(data, textStatus) { 19 if (data.errno == 0) { 20 //删除成功后执行内容 21 } else { 23 //amazeUi alert控件 24 $('#message').html(data.msg); 25 $('#my-alert').modal('open'); 26 } 27 } 28 }); 29 }; 30 31 if (confirm) { 32 confirm.options.onConfirm = onConfirm; 33 confirm.options.onCancel = onCancel; 34 confirm.toggle(this); 35 } else { 36 $confirm.modal({ 37 relatedElement : this, 38 onConfirm : onConfirm, 39 onCancel : function() { 40 } 41 }); 42 } 43 }