lunnlew
lunnlew
  • 发布:2016-01-09 07:40
  • 更新:2016-04-09 16:46
  • 阅读:4549

【报Bug】mui.ready后主动触发下拉刷新,导致pulldownRefresh回调执行两次

分类:MUI

mui.ready后主动触发下拉刷新,导致pulldownRefresh回调执行两次
分析的过程如下
页面中有以下代码

mui.init({  
      pullRefresh: {  
        container: '#refreshArea',  
        down: {  
         callback: pulldownRefresh  
        }  
      }  
    });  
    function pulldownRefresh() {  
      norma.info('pull down Refreshing');  
    }  
    mui.plusReady(function() {  
      norma.info('list plusReady ok');  
      setTimeout(function() {  
        //此处主动触发  
        mui('#refreshArea').pullRefresh().pulldownLoading();  
      },  
      1000);  
    });

接下来跳到mui.js代码段一

pulldownLoading: function() {  
  a.plusReady(function() {  
    plus.webview.currentWebview().setBounce({  
      offset: {  
        //注意:如果这里非零值会触发一个dragBounce事件,请看下面mui.js代码段二  
        top: this.options.down.height + "px"  
      }  
    })  
  }.bind(this));  
  var b = a.options.pullRefresh.down.callback;  
  //这里执行了一次pulldownRefresh回调  
  b && b.call(this)  
}

接下来在跳到mui.js代码段二

_initPulldownRefreshEvent: function() {  
  var b = this;  
  b.topPocket && b.options.webviewId && a.plusReady(function() {  
    var a = plus.webview.getWebviewById(b.options.webviewId);  
    if (a) {  
      b.options.webview = a;  
      var c = b.options.down,  
        d = c.height;  
      a.addEventListener("dragBounce", function(d) {  
        //注意:事实上这里的b.pulldown在第一次到达时并未定义,  
        //然后执行b._initPulldownRefresh(), d.status,此时之后b.pulldown才定义了  
        //进入case dragEndAfterChangeOffset  
        switch (b.pulldown ? b.pullPocket.classList.add(f) : b._initPulldownRefresh(), d.status) {  
          case "beforeChangeOffset":  
            b._setCaption(c.contentdown);  
            break;  
          case "afterChangeOffset":  
            b._setCaption(c.contentover);  
            break;  
          case "dragEndAfterChangeOffset":{  
             //这里又再执行了一次pullRefresh callback  
            a.evalJS("mui&&mui.options.pullRefresh.down.callback()"), b._setCaption(c.contentrefresh)  
          }  
        }  
      }, !1), a.setBounce({  
        position: {  
          top: 2 * d + "px"  
        },  
        changeoffset: {  
          top: d + "px"  
        }  
      })  
    }  
  })  
}

所以执行了两次pulldownRefresh回调
有什么解决方案么??
是BUG吗?,还是使用方法不对???

附件:BUG重现代码压缩包

2016-01-09 07:40 负责人:无 分享
已邀请:
x007xyz

x007xyz - 学习当中

修改pulldownLoading方法

//不需要显示效果去掉这段,也可以自定义样式  
plus.webview.currentWebview().setBounce({  
      offset: {  
        //注意:如果这里非零值会触发一个dragBounce事件,请看下面mui.js代码段二  
        //说法有误应该是当值大于等于 this.options.down.height 时会触发dragBounce事件所以可以设置为一个小于 this.options.down.height的值,能够显示效果但是不触发dragBounce事件  
        top: this.options.down.height + "px"  
      }  
    })  
}.bind(this));
张小鱼

张小鱼

晚上试试,不行把第一次刷新后就进行标注,的二次判断

该问题目前已经被锁定, 无法添加新回复