Javascript 为什么不能直接从AngularJs中的controller调用函数`

Javascript 为什么不能直接从AngularJs中的controller调用函数`,javascript,angularjs,Javascript,Angularjs,我正在尝试更新h1元素中的时钟时间。我试图通过设置间隔来调用函数来更新时间,但无法调用。我找到了应用的解决方案 但我想了解这背后的逻辑。请解释我无法调用的原因以及我们为什么要使用apply方法 以下是我的作品: angular.module('Book',[]) .controller('MyController',函数($scope){ var updatelock=function(){ $scope.clock=新日期(); }; setInterval(函数(){ UpdateLock

我正在尝试更新
h1
元素中的时钟时间。我试图通过设置间隔来调用函数来更新时间,但无法调用。我找到了
应用的解决方案

但我想了解这背后的逻辑。请解释我无法调用的原因以及我们为什么要使用apply方法

以下是我的作品:

angular.module('Book',[])
.controller('MyController',函数($scope){
var updatelock=function(){
$scope.clock=新日期();
};
setInterval(函数(){
UpdateLock();//从这里调用时不工作。。。?
//$scope.$apply(updatelock);//它可以工作!
}, 1000);
updateLock();//它第一次工作。
});

你好{{时钟}

基本上,
$scope.apply()
正在将更改应用于视图中的作用域,因此在使用apply时它会起作用

要在不使用它的情况下更新作用域,应使用Angular的
$interval
服务,而不是setInterval()函数。这基本上是在服务中调用
$apply()
函数,从而更改视图,而无需调用$apply函数来实现更改。

这是为您准备的

您应该使用$interval angular服务,而不是javascript的setInterval

 $interval(function() {
        updateClock(); //not working when i call from here...?
        //$scope.$apply(updateClock); //it works!
    }, 1000);

现在,您需要为setInterval设置$scope.apply()的原因是,您在angular的作用域之外工作,需要手动执行摘要循环以在angular的作用域内对其进行验证。

在控制器内部,使用
$interval
而不是
setInterval
$interval
将自动触发
$digest
循环。因此,您无需手动调用
$scope.$apply
。相反,它将被
$interval
隐式调用。一定要记住在控制器中注入
$interval
,同时还要注入依赖项

只有在超出角度上下文时,才能使用
$scope.$apply
。例如,您使用jQuery执行某些部分,然后必须通过
$scope.$apply.
让angular知道更改,但当您在控制器中时,根本不需要这样做

angular.module('Book',[])
.controller('MyController',函数($scope,$interval){
var updatelock=function(){
$scope.clock=新日期();
};
$interval(函数(){
UpdateLock();//从这里调用时不工作。。。?
//$scope.$apply(updatelock);//它可以工作!
}, 1000);
updateLock();//它第一次工作。
});

你好{{时钟}
简而言之,

Angular在某个特定事件上运行$digest cycle($digest cycle实际上负责双向数据绑定或脏检查)。该事件可能是在调用$scope函数、$http返回数据、$timeout、$interval等时发生的。但如果使用了除此之外的其他方法,Angular则不知道有任何更改(比如说setTimeout,它是javascript函数),所以我们需要明确地告诉angular,对于这个angular,我们得到$apply

长期


请参考此链接,这不是我的重复答案吗,先生:)我也开始键入@squiroid,刚刚设置演示,所以延迟了1分钟:)有点过头了,但setTimeout不是jquery函数。它是