"AngularJS中的全局变量"

7 浏览
0 Comments

"AngularJS中的全局变量"

我有一个问题,我在控制器中的作用域内初始化了一个变量。然后当用户登录时,另一个控制器会对它进行更改。这个变量用于控制导航栏之类的东西,并根据用户类型限制站点的某些部分的访问,因此它保持其值非常重要。问题在于,初始化它的控制器被angular某种方式再次调用,然后将变量重置为其初始值。

我认为这不是声明和初始化全局变量的正确方法,呃,它不是真正的全局变量,因此我的问题是什么是正确的方法,是否有好的示例可用于当前版本的angular?

admin 更改状态以发布 2023年5月20日
0
0 Comments

\n\n如果你只是想存储一个值,根据 Angular documentation on Providers,你应该使用 Value recipe:\n\n

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

\n\n然后在控制器中使用它,就像这样:\n\n

myApp.controller('DemoController', ['clientId', function DemoController(clientId) {
    this.clientId = clientId;
}]);

\n\n由于 Provider、Factory 或 Service 只是 provider recipe 的语法糖,所以你也可以通过使用它们来完成相同的事情,但使用 Value 将以最小的语法实现你想要的效果。\n\n另一个选项是使用 $rootScope,但实际上它不是一个选项,因为你不应该像在其他语言中使用全局变量一样使用它。建议适度使用。\n\n由于所有作用域都继承自 $rootScope,如果你有一个变量 $rootScope.data,而某个人忘记了 data 已经被定义,并在本地作用域中创建了 $scope.data,你将会遇到问题。\n\n如果你想修改这个值并使它在所有控制器中持久存在,请使用一个对象并修改属性,记住 JavaScript 是\"引用的副本\":\n\n

myApp.value('clientId', { value: 'a12345654321x' });
myApp.controller('DemoController', ['clientId', function DemoController(clientId) {
    this.clientId = clientId;
    this.change = function(value) {
        clientId.value = 'something else';
    }
}];

\n\nJSFiddle example

0
0 Comments

您有2个基本的“全局”变量选项:

$rootScope是所有作用域的父对象,因此在那里公开的值将在所有模板和控制器中可见。 使用$rootScope非常容易,因为您可以将其注入任何控制器并在此范围内更改值。 它可能很方便,但也有全局变量的所有问题。

服务是单例,您可以将其注入到任何控制器中,并在控制器的范围内公开其值。 服务作为单例仍然是“全局”的,但您对这些服务在何处使用和公开有更好的控制。

使用服务有些复杂,但不是太多,以下是一个示例:

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

然后在控制器中:

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

这里是工作的jsFiddle:http://jsfiddle.net/pkozlowski_opensource/BRWPM/2/

0