场景:列表行每行都有删除按钮,点击删除按钮将行记录的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     }