我是Angular的初学者。我坚持更新角度js中的$ scope变量。我创建了一个服务名称" Main"我想用它来更新我的$ scope.token。我使用了$ scope.apply和$ scope.digest,但收到以下错误:
> Error: [$rootScope:inprog] $apply already in progress
> http://errors.angularjs.org/1.4.4/$rootScope/inprog?p0=%24apply
> at angular.js:68
> at beginPhase (angular.js:16273)
> at Scope.$apply (angular.js:16014)
> at new <anonymous> (controllers.js:11)
> at Object.invoke (angular.js:4473)
> at extend.instance (angular.js:9093)
> at nodeLinkFn (angular.js:8205)
> at compositeLinkFn (angular.js:7637)
> at compositeLinkFn (angular.js:7641)
> at publicLinkFn (angular.js:7512)
以下是代码段。
的index.html
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a ng-href="#/">Home</a></li>
<li data-ng-show="token"><a ng-href="#/me">Me</a></li>
<li data-ng-hide="token"><a ng-href="#/signin">Signin</a></li>
<li data-ng-hide="token"><a ng-href="#/signup">Signup</a></li>
<li ><a data-ng-show='true' ng-click="logout()">Logout</a></li>
</ul>
</div>
services.js
'use strict';
angular.module('angularRestfulAuth')
.factory('Main', ['$http', '$localStorage','$cookies', function($http, $localStorage,$cookies){
return {
tokShowhide: function(data) {
if($cookies.get('sid')!=undefined)
return true;
else
return false;
}
};
}]);
在controllers.js
中 $scope.$apply(function () {
$scope.token = Main.tokShowhide();
});
如何更新$ scope变量并在我的视图中反映其变化 (index.html)??
答案 0 :(得分:0)
您在哪个上下文中执行$apply()
?
如果您在ng-click
的某个功能中执行此操作,则在加载控制器时(例如,在您单击带有ng-href
的链接后导航时),没有必要使用$apply()
,因为你已经在angularJs上下文中执行。
当你在角度上下文之外时,你需要调用$apply()
,例如,如果你正在使用jquery事件。
所有angularjs事件(ng-click
,ng-mouseover
,ng-mouseenter
,ng-class
)都是纯Javascript中不同事件或功能的包装,加上{{1}的调用因此,Angular知道必须检查$apply()
并更新视图。 Angular的内置服务也是如此。
总之,你只需要做
$watchers
直接
答案 1 :(得分:0)
您的错误是由您在控制器中调用$scope.$apply()
引起的。
而不是:
$scope.$apply(function () {
$scope.token = Main.tokShowhide();
});
这样做:
$scope.token = Main.tokShowhide();
答案 2 :(得分:0)
我通常使用$ scope。$ apply()如果通过Angular的内置服务以外的方式更新范围变量。最常见的是,当使用jQuery之类的东西执行异步请求,然后想要用结果更新范围变量时,我会看到这一点。但是,如果您只是更新范围变量而不执行任何异步操作,则Angular具有双向数据绑定,并且这些更新通常会在更改后自动更新。
如果由于某种原因你更新了一个范围变量,但它没有在你的视图上更新,你可以尝试使用$ scope。$ apply(),但我更喜欢注入$ timeout然后包装范围变量你在$ timeout服务中更新,如下所示:
$timeout(function(){
$scope.token = Main.tokShowhide();
})
这也将触发新的摘要周期并使用这些新的范围值更新您的视图,并在接收到您正在描述的正在进行的摘要周期的错误时起作用。