javascript - AngularJs:如何访问 Controller 外部的全局变量?

标签 javascript angularjs

<分区>

我正在尝试通过普通函数访问全局变量,这可能吗?

我已经使用 $rootScope 设置了一些 var,我正在尝试通过回调函数访问它。 这个回调是从 Controller 调用的。我不想在该回调中传递 $rootScope

有什么方法可以访问那个 $rootScope.var 吗?

如果可能,我愿意使用服务。

请提出建议。

谢谢

我正在尝试按如下方式访问 rootScope:

    function fbLandingCtrl($scope, $rootScope) {
    $rootScope.isFBLoggedin = false;
    $scope.login = function() {
       console.log( $rootScope.isFBLoggedin);
       fbHelper.login(getUserInfo);
      };

      function getUserInfo(){
          fbHelper.getUserInfo(updateStatus);
      }
      function updateStatus(userInfo){
          $rootScope.isFBLoggedin = true;
          console.log( $rootScope.isFBLoggedin);
      }
  }

我的服务是:

    myapp.factory('FBService', [ '$rootScope', function ($rootScope) {
    $rootScope.isFBLoggedin = false; // global variable
    $rootScope.userName = null;
    $rootScope.userEmail = null;

    return {

        getStatus: function() {
            return $rootScope.isFBLoggedin;
        },
        setStatus: function(status) {
            console.log("Status:"+status);
            return $rootScope.isFBLoggedin = status;
        }
       };
}]);

它在 updateStatus fn 下显示 isFBLoggedin 为 true 但它没有反射(reflect)在 View 上

我正在打印 {{isFBLoggedin}} 但 ts 显示 false

终于开始工作了。

我遵循了@dluz 的解决方案。

我还使用了 $rootScope.$apply(function() {}}) 来渲染 View

最佳答案

请不要使用 $rootScope 来定义任何函数 - 这是非常糟糕的做法。请记住 $rootScope 毕竟是一个全局变量。

您可以通过这样的服务获取 $rootScope:

<!doctype html>
 <html lang="en" ng-app="myApp">
  <head>
<meta charset="UTF-8">
<title>Document</title>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.min.js"></script>

  <script>

     var myApp = angular.module('myApp', []);

      myApp.controller('myAppCtrl', ['$scope', 'myService', function ($scope, myService) {

       console.log(myService.getData());
    
}])

        myApp.factory('myService', [ '$rootScope', function ($rootScope) {
    
       return {
        
        getData: function() {
            return $rootScope;
        }
       };
      }])


    </script>

  </head>
  <body ng-controller="myAppCtrl">

   </body>
   </html>

$rootScope exists, but it can be used for evil

Scopes in Angular form a hierarchy, prototypically inheriting from a root scope at the top of the tree. Usually this can be ignored, since most views have a controller, and therefore a scope, of their own.

Occasionally there are pieces of data that you want to make global to the whole app. For these, you can inject $rootScope and set values on it like any other scope. Since the scopes inherit from the root scope, these values will be available to the expressions attached to directives like ng-show just like values on your local $scope.

Of course, global state sucks and you should use $rootScope sparingly, like you would (hopefully) use with global variables in any language. In particular, don't use it for code, only data. If you're tempted to put a function on $rootScope, it's almost always better to put it in a service that can be injected where it's needed, and more easily tested.

Conversely, don't create a service whose only purpose in life is to store and return bits of data.

更新的答案

A_J,我不确定你的应用场景是什么。我需要查看更多代码才能为您提供更好的答案,但请查看下面的代码。也许它可以让您了解如何设计代码以访问 service 中的 $rootScope

按“登录”按钮并查看您的控制台。这里的工作示例(http://jsbin.com/olOyaHa/1/)

 <!doctype html>
 <html lang="en" ng-app="myApp">
    <head>
 <meta charset="UTF-8">
 <title>Document</title>
 <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.min.js"></script>

 <script>

     var myApp = angular.module('myApp', []);

     myApp.controller('fbLandingCtrl', ['$scope', '$rootScope', 'loginService', function ($scope, $rootScope, loginService) {

    $rootScope.isFBLoggedin = false;
    
    $scope.login = function() {
       console.log('Current login status', $rootScope.isFBLoggedin);

       console.log(loginService.getUserInfo());

       loginService.login(loginService.getUserInfo());

       loginService.updateStatus();
      };

    
     }]);


     myApp.factory('loginService', [ '$rootScope', function ($rootScope) {
    
    return {
        
        login: function() {
            console.log('now I am logged in!');
            return $rootScope.isFBLoggedin = true;
        },

        getUserInfo: function() {
            return {
                username: 'xmen',
                role: 'admin',
                logged: 'false'
            };
        },
        
        updateStatus: function(userInfo){
            $rootScope.isFBLoggedin = true;
            console.log('Current login status', $rootScope.isFBLoggedin);
        }
        };
     }])


    </script>

 </head>
 <body ng-controller="fbLandingCtrl">
    <button ng-click="login()">Log Me In</button>
 </body>
 </html>

关于javascript - AngularJs:如何访问 Controller 外部的全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19137695/

相关文章:

javascript - 在 AngularJS 中将 base64 转换为图像文件

javascript - 如何隐藏/显示父 View 的元素?

angularjs - 在IDE中工作时如何设置环境变量CHROME_BIN?

angularjs - IntelliJ 13.1 angularjs 插件不起作用

javascript - 应用关闭后重新打开()事件

javascript - 数据表jquery点击事件在分页后不起作用

javascript - 对我的 Node js 应用程序的所有传入请求进行解码

javascript - Angular JS - 文本框未在独立范围内更新

javascript - 获取位于同一对象中的函数的引用

javascript - Meteor 并用值填充数组