在AngularJS上使用'全局'变量

时间:2015-02-18 12:15:33

标签: 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,21]; // populating from a json or other source
});

app.directive('myDirective2', function(){
    var x = app.globalVar;
});

我认为这很糟糕,但我想知道,从技术角度来看,为什么这是错误的,以及正确使用“全球”的原因是什么? AngularJS中的变量。

我读过关于使用$ rootScope的内容,我还读到了版本2.0 AngularJS正在丢弃$ scope altogheter的地方,所以也许唯一的方法就是使用服务/工厂?

3 个答案:

答案 0 :(得分:4)

一般情况下,我不使用全局变量。它们污染了窗口范围,可能会使代码更加混乱。对于像您提供的示例,我建议使用工厂或服务来保存数据。然后,您可以将其清楚地注入您想要的任何控制器/直接/其他服务。虽然您的同事是正确的,但有很多方法可以做,我不建议污染全球范围。

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

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

  return {
    get: function() {
      return globalVar;
    }
  }
}

然后在你的控制器(或其他)

app.
  module('myApp')
  .controller('MyCtrl', MyCtrl);

  function MyCtrl(myService) {
    var localVar = myService.get();
  }

答案 1 :(得分:0)

以下是我在设计时遵循的一些约定

一个。 全局变量 - 将变量附加到$rootscope,然后您可以在任何子$scope中使用这些变量。此外,您甚至可以跨控制器监听rootcope上的事件。 提示:避免这种情况,因为您可能会在rootscopelisteners上跨越控制器传播过多的变量。

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

℃。 Angular Factory - 与服务非常相似,但使用它来存储静态数据,例如基本网址,API密钥,视图之间的按钮状态等。

d。 角度控制器 - 尽量使控制器保持最少的编码和业务逻辑。只有路由和基本绑定应该在控制器中完成。

我希望它对你的论证有所帮助。 :)

答案 2 :(得分:0)

使用全局变量的好方法

Angular Service:

(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();
}]);