Global variables in AngularJS

前端 未结 12 1820
被撕碎了的回忆
被撕碎了的回忆 2020-11-22 12:05

I have a problem where i\'m initialising a variable on the scope in a controller. Then it gets changed in another controller when a user logs in. This variable is used to co

相关标签:
12条回答
  • 2020-11-22 12:07

    In the interest of adding another idea to the wiki pool, but what about AngularJS' value and constant modules? I'm only just starting to use them myself, but it sounds to me like these are probably the best options here.

    Note: as of the time of writing, Angular 1.3.7 is the latest stable, I believe these were added in 1.2.0, haven't confirmed this with the changelog though.

    Depending on how many you need to define, you might want to create a separate file for them. But I generally define these just before my app's .config() block for easy access. Because these are still effectively modules, you'll need to rely on dependency injection to use them, but they are considered "global" to your app module.

    For example:

    angular.module('myApp', [])
      .value('debug', true)
      .constant('ENVIRONMENT', 'development')
      .config({...})
    

    Then inside any controller:

    angular.module('myApp')
      .controller('MainCtrl', function(debug, ENVIRONMENT), {
        // here you can access `debug` and `ENVIRONMENT` as straight variables
      })
    

    From the initial question is actually sounds like static properties are required here anyway, either as mutable (value) or final (constant). It's more my personal opinion than anything else, but I find placing runtime configuration items on the $rootScope gets too messy, too quickly.

    0 讨论(0)
  • 2020-11-22 12:07
    localStorage.username = 'blah'
    

    If you're guaranteed to be on a modern browser. Though know your values will all be turned into strings.

    Also has the handy benefit of being cached between reloads.

    0 讨论(0)
  • You've got basically 2 options for "global" variables:

    • use a $rootScope http://docs.angularjs.org/api/ng.$rootScope
    • use a service http://docs.angularjs.org/guide/services

    $rootScope is a parent of all scopes so values exposed there will be visible in all templates and controllers. Using the $rootScope is very easy as you can simply inject it into any controller and change values in this scope. It might be convenient but has all the problems of global variables.

    Services are singletons that you can inject to any controller and expose their values in a controller's scope. Services, being singletons are still 'global' but you've got far better control over where those are used and exposed.

    Using services is a bit more complex, but not that much, here is an example:

    var myApp = angular.module('myApp',[]);
    myApp.factory('UserService', function() {
      return {
          name : 'anonymous'
      };
    });
    

    and then in a controller:

    function MyCtrl($scope, UserService) {
        $scope.name = UserService.name;
    }
    

    Here is the working jsFiddle: http://jsfiddle.net/pkozlowski_opensource/BRWPM/2/

    0 讨论(0)
  • 2020-11-22 12:08

    It's actually pretty easy. (If you're using Angular 2+ anyway.)

    Simply add

    declare var myGlobalVarName;
    

    Somewhere in the top of your component file (such as after the "import" statements), and you'll be able to access "myGlobalVarName" anywhere inside your component.

    0 讨论(0)
  • 2020-11-22 12:13

    Example of AngularJS "global variables" using $rootScope:

    Controller 1 sets the global variable:

    function MyCtrl1($scope, $rootScope) {
        $rootScope.name = 'anonymous'; 
    }
    

    Controller 2 reads the global variable:

    function MyCtrl2($scope, $rootScope) {
        $scope.name2 = $rootScope.name; 
    }
    

    Here is a working jsFiddle: http://jsfiddle.net/natefriedman/3XT3F/1/

    0 讨论(0)
  • 2020-11-22 12:16

    You can also do something like this ..

    function MyCtrl1($scope) {
        $rootScope.$root.name = 'anonymous'; 
    }
    
    function MyCtrl2($scope) {
        var name = $rootScope.$root.name;
    }
    
    0 讨论(0)
提交回复
热议问题