$apply用法注意

  Angular为我们提供了一些接口绑定JavaScript代码和数据,而绑定数据改变和更新angular则是使用$apply方法实现的。

$apply

  进行数据变化检查的实际上是$digest函数,但是我们往往不是直接使用$digest,而是使用$apply$apply接收表达式或者函数作为参数后调用$digest来更新绑定部门以及监控器。实际上,Angular几乎在所有提供的代码中添加了$apply,如ng-click,初始controller,$http的回调操作,在这,你并不需要亲自调用 $apply,而且重复的调用会引起错误。

  因此,当你运行了一个新阶段,并且这部分并不属于Angular库的情况下才需要使用$apply。这有一段关于setTimeout的代码,在经过了2000毫秒的延迟之后,代码进入执行了一个新的阶段,但是Angular并不知道数据有更新,因此更新并不会被显示。

function Ctrl($scope) {  
    $scope.message = "Waiting 2000ms for update";

    setTimeout(function () {
        $scope.message = "Timeout called!";
        // AngularJS unaware of update to $scope
    }, 2000);  
}

在上面的代码中就需要调用$apply方法,手动调用,另外Angular提供了$timeout来代替setTimeout,相当于在其中默认调用$apply。一般直接使用Angular里面的方法则不用调用$apply方法。

  另外,除$http之外的Ajax调用,除了ng-*之外的监听器,或者除了$timeout之外的计时器,都应该使用$scope.$apply来同步显示绑定。如下例子,则是Ajax的例子。

$.ajax({
            type: 'GET',
            url: '/rest/caseinfo/getcaseinfobybh/' + bh,
            contentType: "application/json",
            success: function (data, textStatus) {
                $scope.caseinfo = data;
                $scope.$apply();
            },
            error: function (xmlHttpRequest, textStatus, errorThrown) {
                alert("获取异常 " + errorThrown);
            }
        });

  这里使用JQuery里面的方法,调用$scope域内的参数,则需要手动调用$apply方法。

posted @ 2017-02-27 15:59  不可替代的毛线  阅读(2855)  评论(0编辑  收藏  举报