好吧,我与一位同事讨论了在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的地方,所以也许唯一的方法就是使用服务/工厂?
答案 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上的事件。 提示:避免这种情况,因为您可能会在rootscope
和listeners
上跨越控制器传播过多的变量。
湾角度服务 - 如果要在两个或多个控制器之间共享数据,请使用此选项。这是访问/共享数据的最佳方式。
℃。 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();
}]);