ionic中$interval 和 $apply()

media.addEventListener('timeupdate', function() {//监听视频播放时间
     if(media.currentTime>1){//如果视频播时间超过1秒         $scope.scoreShow=true;//打分框弹出
      console.log($scope.scoreShow);//true
};
},true);

给一个视频 media 对象添加监听事件: timeupdate 时,回调函数正常执行,$scope.scoreShow也变成了true,但是在html页面上

<!--打分弹框-->
<
div class="videoMessage" ng-show="scoreShow"> <p>打个分,留下你的态度!</p> <p class="btns"> <span ng-click="confirmScore()">确定</span> <span ng-click="ignoreScore()">无视</span> </p> </div>

视频播放到1秒以后,打分弹框始终不显示,而且在页面的控制台去看打分弹框,display:none!important;

说明$scope.scoreShow事实上没有起作用。

很奇怪的一点是:

如果在同一个controller中有一行:$interval(function(){},0);

如下


media.addEventListener('timeupdate', function() {//监听视频播放时间
     if(media.currentTime>1){//如果视频播时间超过1秒
         $scope.scoreShow=true;//打分框弹出
      console.log($scope.scoreShow);//true };
},true);
$interval(function(){},0);

打分弹框就会显示。

但是如果把$interval 换成原生代码setInterval , 打分弹框也不会显示。

***** 重点:

因此,推断:因为ionic不知道原生代码做了一些事情,所以不知道$scope.scoreShow改变了,要ionic知道需要用到$scope.$apply()把$scope.scoreShow=true包起来:

media.addEventListener('timeupdate', function() {//监听视频播放时间
     if(media.currentTime>1){//如果视频播时间超过1秒
             $scope.$apply(function(){
                 $scope.scoreShow=true;//打分框弹出
             });
     };
 },true);

这样$scope.scoreShow不只是变成了true,还真正起到作用了,打分弹框显示了。

备注 :

  引用 http://www.2cto.com/kf/201311/256848.html 里的一段话来解释:什么时候用$apply()

     那我们到底什么时候需要去调用$apply()方法呢?情况非常少,实际上几乎我们所有的代码都包在$scope.$apply()里面,像ng-click,controller的初始化,$http的毁掉函数等。在这些情况下,我们不需要自己调用,实际上我们也不能自己调用,否则在$apply()方法里面再调用$apply()方法会抛出错误。如果我们需要在一个新的执行序列中运行代码时才真正需要用到它,而且当且仅当这个新的执行序列不是被angular JS的库的方法创建的,这个时候我们需要将代码用$scope.$apply()包起来
 
posted @ 2017-04-05 11:50  cao_zhen  阅读(1178)  评论(0编辑  收藏  举报