什么时候应该使用$ scope.apply()?

时间:2015-03-31 17:31:15

标签: javascript angularjs angularjs-scope

$ scope.apply做什么?在某些情况下,如果$ scope.apply()不存在,则不会触发$ scope.watch()。例如,

控制器具有以下内容:

setTimeout(function(){
  $scope.person = someperson;
}, 500);
人们正在指令中观看。

$scope.watch('person', function(){
  console.log($scope.person);
  $scope.apply();
});

在这种情况下,仅在申请时才​​会触发监视。

3 个答案:

答案 0 :(得分:1)

$ scope.apply()会触发AngularJS的 $ digest 循环。简单来说,它只是一种触发应用程序重新渲染的便捷方式。

通常在您想要运行一个超出角度应用程序的代码时使用它。

直接来自文档:

  

$ apply()用于从外部执行角度表达式   角度框架。 (例如,来自浏览器DOM事件,   setTimeout,XHR或第三方库)。因为我们正在呼唤   我们需要执行适当范围生命周期的角度框架   异常处理,执行手表。

使用范围的示例。$ apply()和jQuery Datepicker:

angular.module('customApp', []).directive('datepicker', function () {
    return {
        require: 'ngModel',
         link: function (scope, element, attrs, ngModelCtrl) {
            jQuery(element).datepicker({
                onSelect: function (date) {
                    scope.myDate = date;
                    scope.$apply();
                }
            });
        }
    };
});

答案 1 :(得分:0)

如果您在外部(从外部JavaScript)修改AngularJS模型 - 您应该使用$ scope。$ apply()让AngularJS知道模型已更改。在您的示例中,您使用setTimeout(),这是一个异步外部js方法。但是,如果您使用AngularJS $ timeout,则不需要调用$ scope。$ apply()。

答案 2 :(得分:0)

setTimeout(function(){}: - javascript函数超出了anuglar js的范围,你需要在$ scope.apply()的帮助下手动应用摘要周期;

但你可以使用$ timeout服务,这是一种更有棱角的方式。