我可以在每个控制器angular度提供一个function吗?
如果我有一个实用函数foo
,我希望能够从我的ng-app
声明中的任何地方调用。 有没有办法让我的模块设置可以全局访问,还是需要将它添加到每个控制器的作用域?
基本上有两个选项,可以将其定义为服务,也可以将其放在根作用域上。 我build议你从中提出一个服务来避免污染根域。 您可以创build一个服务并使其在您的控制器中可用,如下所示:
<!doctype html> <html ng-app="myApp"> <head> <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> <script src="http://code.angularjs.org/1.1.2/angular.min.js"></script> <script type="text/javascript"> var myApp = angular.module('myApp', []); myApp.factory('myService', function() { return { foo: function() { alert("I'm foo!"); } }; }); myApp.controller('MainCtrl', ['$scope', 'myService', function($scope, myService) { $scope.callFoo = function() { myService.foo(); } }]); </script> </head> <body ng-controller="MainCtrl"> <button ng-click="callFoo()">Call foo</button> </body> </html>
如果这不是您的select,您可以将其添加到根作用域,如下所示:
<!doctype html> <html ng-app="myApp"> <head> <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> <script src="http://code.angularjs.org/1.1.2/angular.min.js"></script> <script type="text/javascript"> var myApp = angular.module('myApp', []); myApp.run(function($rootScope) { $rootScope.globalFoo = function() { alert("I'm global foo!"); }; }); myApp.controller('MainCtrl', ['$scope', function($scope){ }]); </script> </head> <body ng-controller="MainCtrl"> <button ng-click="globalFoo()">Call global foo</button> </body> </html>
这样,所有模板都可以调用globalFoo()
而不必将其从控制器传递给模板。
你也可以结合他们我猜:
<!doctype html> <html ng-app="myApp"> <head> <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> <script src="http://code.angularjs.org/1.1.2/angular.min.js"></script> <script type="text/javascript"> var myApp = angular.module('myApp', []); myApp.factory('myService', function() { return { foo: function() { alert("I'm foo!"); } }; }); myApp.run(function($rootScope, myService) { $rootScope.appData = myService; }); myApp.controller('MainCtrl', ['$scope', function($scope){ }]); </script> </head> <body ng-controller="MainCtrl"> <button ng-click="appData.foo()">Call foo</button> </body> </html>
虽然第一种方法被认为是“像angular的”方法,但我觉得这增加了开销。
考虑如果我想在10个不同的控制器中使用这个myservice.foo函数。 我将不得不指定这个“我的服务”依赖项,然后在其中的所有十个$ scope.callFoo范围属性。 这只是一个重复,不知何故违反了DRY原则。
而如果我使用$ rootScope的方法,我只能指定这个全局函数gobalFoo一次,它将在我所有将来的控制器中使用,不pipe它有多less。
AngularJs的“ 服务 ”和“ 工厂 ”只是像你这样的问题。这些是用来在控制器,指令,其他服务或任何其他angularjs组件之间有全局的东西..您可以定义函数,存储数据,计算function或任何你想要在服务里面,并在AngularJs组件中使用它们作为Global
angular.module('MyModule', [...]) .service('MyService', ['$http', function($http){ return { users: [...], getUserFriends: function(userId){ return $http({ method: 'GET', url: '/api/user/friends/' + userId }); } .... } }])
如果你需要更多
查找更多关于为什么我们需要AngularJs服务和工厂
我对Angular来说有点新,但是我发现有用的做法(而且非常简单)是我制作了一个全局脚本,我在本地脚本之前加载了全局variables,我需要在所有页面上访问这些全局variables。 在该脚本中,我创build了一个名为“globalFunctions”的对象,并添加了我需要作为属性全局访问的函数。 例如globalFunctions.foo = myFunc();
。 然后,在每个本地脚本中,我写了$scope.globalFunctions = globalFunctions;
我可以立即访问我添加到全局脚本中globalFunctions对象的任何函数。
这是一个解决方法,我不知道它可以帮助你,但它肯定帮助了我,因为我有很多function,并且把它们全部添加到每个页面都是一种痛苦。