使用角度js中的服务更新范围变量

时间:2015-10-17 18:54:56

标签: javascript angularjs angularjs-scope

我是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)??

3 个答案:

答案 0 :(得分:0)

您在哪个上下文中执行$apply()

如果您在ng-click的某个功能中执行此操作,则在加载控制器时(例如,在您单击带有ng-href的链接后导航时),没有必要使用$apply(),因为你已经在angularJs上下文中执行。

当你在角度上下文之外时,你需要调用$apply(),例如,如果你正在使用jquery事件。

所有angularjs事件(ng-clickng-mouseoverng-mouseenterng-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();
})

这也将触发新的摘要周期并使用这些新的范围值更新您的视图,并在接收到您正在描述的正在进行的摘要周期的错误时起作用。