Javascript 使用';全球';AngularJS上的变量

Javascript 使用';全球';AngularJS上的变量,javascript,angularjs,angularjs-directive,angularjs-scope,angularjs-service,Javascript,Angularjs,Angularjs Directive,Angularjs Scope,Angularjs Service,好的,我和一位同事就如何在AngularJS上正确使用全局变量进行了激烈的争论。他的理由是:有很多方法可以“做”事情 考虑这一点: var app = angular.module('myApp', []); app.globalVar = []; // this is just to store same data later 然后在一些指令/服务上: app.directive('myDirective', function(){ app.globalVar = [23,43,2

好的,我和一位同事就如何在AngularJS上正确使用全局变量进行了激烈的争论。他的理由是:有很多方法可以“做”事情

考虑这一点:

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

app.globalVar = []; // this is just to store same data later
然后在一些指令/服务上:

app.directive('myDirective', function(){
    app.globalVar = [23,43,21]; // populating from a json or other source
});

app.directive('myDirective2', function(){
    var x = app.globalVar;
});
我认为这很糟糕,但我想知道,从技术角度来看,为什么这是错误的,以及在AngularJS中如何正确使用“全局”变量


我读过关于使用$rootScope的内容,还读到在2.0版上AngularJS正在删除$scope altogheter,所以可能唯一的方法是使用服务/工厂?

通常我不使用全局变量。它们会污染窗口范围,并使代码更加混乱。对于您给出的示例,我建议使用工厂或服务来持久化数据。然后,您可以将它清楚地注入到您想要的任何控制器/直接/其他服务中。虽然你的同事说有很多方法可以做,但我不建议你污染全球范围

app.
 module('myApp')
 .factory('myFactory', myFactory);

function myFactory() {
  var globalVar = [23,43,21];

  return {
    get: function() {
      return globalVar;
    }
  }
}
然后在你的控制器里(或其他什么)


一般来说,我不使用全局变量。它们会污染窗口范围,并使代码更加混乱。对于您给出的示例,我建议使用工厂或服务来持久化数据。然后,您可以将它清楚地注入到您想要的任何控制器/直接/其他服务中。虽然你的同事说有很多方法可以做,但我不建议你污染全球范围

app.
 module('myApp')
 .factory('myFactory', myFactory);

function myFactory() {
  var globalVar = [23,43,21];

  return {
    get: function() {
      return globalVar;
    }
  }
}
然后在你的控制器里(或其他什么)


下面是我在设计时遵循的一些惯例

a全局变量-将变量附加到
$rootscope
,然后您可以在任何子
$scope
中使用该变量。此外,您甚至可以跨控制器侦听rootscope上的事件提示:避免这种情况,因为在
rootscope
侦听器
上可能会出现过多的变量

b角度服务-当您希望在两个或多个控制器之间共享数据时,请使用此选项。这是访问/共享数据的最佳方式

c角度工厂-非常类似于服务,但使用它来存储静态数据,如基本URL、api键、视图之间的按钮状态等

d角度控制器-尽量使控制器的编码和业务逻辑最少。仅在控制器中进行路由和基本绑定


我希望这对你的论点有所帮助

下面是我在设计时遵循的一些惯例

a全局变量-将变量附加到
$rootscope
,然后您可以在任何子
$scope
中使用该变量。此外,您甚至可以跨控制器侦听rootscope上的事件提示:避免这种情况,因为在
rootscope
侦听器
上可能会出现过多的变量

b角度服务-当您希望在两个或多个控制器之间共享数据时,请使用此选项。这是访问/共享数据的最佳方式

c角度工厂-非常类似于服务,但使用它来存储静态数据,如基本URL、api键、视图之间的按钮状态等

d角度控制器-尽量使控制器的编码和业务逻辑最少。仅在控制器中进行路由和基本绑定


我希望这对你的论点有所帮助

使用全局变量的好方法

角度服务:

(function () {

var userService = function () {

    var getGlobalVar = function () {
        var globalVar = [23, 43, 21];
    };
    return {
        globalVar: globalVar
    };
};
var mod = angular.module("myApp");
mod.factory("userService", userService);
}());
app.controller("MyCtrl",['userService' function (userService) {

var test = userService.getGlobalVar();
}]);
角度控制器:

(function () {

var userService = function () {

    var getGlobalVar = function () {
        var globalVar = [23, 43, 21];
    };
    return {
        globalVar: globalVar
    };
};
var mod = angular.module("myApp");
mod.factory("userService", userService);
}());
app.controller("MyCtrl",['userService' function (userService) {

var test = userService.getGlobalVar();
}]);

使用全局变量的好方法

角度服务:

(function () {

var userService = function () {

    var getGlobalVar = function () {
        var globalVar = [23, 43, 21];
    };
    return {
        globalVar: globalVar
    };
};
var mod = angular.module("myApp");
mod.factory("userService", userService);
}());
app.controller("MyCtrl",['userService' function (userService) {

var test = userService.getGlobalVar();
}]);
角度控制器:

(function () {

var userService = function () {

    var getGlobalVar = function () {
        var globalVar = [23, 43, 21];
    };
    return {
        globalVar: globalVar
    };
};
var mod = angular.module("myApp");
mod.factory("userService", userService);
}());
app.controller("MyCtrl",['userService' function (userService) {

var test = userService.getGlobalVar();
}]);

这个全局变量是什么?在哪里使用?值更改的频率是多少?…只是一个随机变量,用于保存数据以供以后使用,没有什么特别的。例如,它可以是
var myArray=[]
,然后它将作为哑变量在各种函数上使用,在这些函数中不断更改值。因此有了一个论点,这个全局变量是什么?在哪里使用?值更改的频率是多少?…只是一个随机变量,用于保存数据以供以后使用,没有什么特别的。例如,它可以是
var myArray=[]
,然后它将作为哑变量在各种函数上使用,在这些函数中不断更改值。因此,当您希望变量支持$watch并在ng模型或任何其他方式中使用它们时,您会怎么做?我认为使用$rootscopeThank@DannyBlue很好,我知道有些地方不对劲,你对全局范围的评论为我和同事的争论增添了一些积极的见解。是的@Ahmad,我想是的,谢谢你的反馈。当你想要支持$watch的变量并以ng模型或其他方式使用它们时,你会怎么做?我认为使用$rootscopeThank@DannyBlue很好,我知道有些地方不对劲,你对全球范围的评论为我与同事的争论增添了一些积极的见解。是的@Ahmad,我想是的,谢谢你的反馈。谢谢你分享这个,有意义。谢谢你分享这个,有意义。