如果我有一个实用函数foo
,我希望能够从我ng-app
声明的任何地方调用。是否可以通过模块设置使其全局访问,还是需要将其添加到每个控制器的作用域中?
如果我有一个实用函数foo
,我希望能够从我ng-app
声明的任何地方调用。是否可以通过模块设置使其全局访问,还是需要将其添加到每个控制器的作用域中?
Answers:
基本上,您有两个选择,要么将其定义为服务,要么将其放在根范围内。我建议您使用它来提供服务,以避免污染根范围。您创建一个服务,并使其在控制器中可用,如下所示:
<!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>
如果这不是您的选择,则可以将其添加到根范围,如下所示:
<!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()
而不必将其从控制器传递到模板。
foo()
功能该怎么办?$scope.callFoo()
为他们每个人做一个包装是太多的工作。如何将库的所有功能“附加”到作用域中,以便可以在模板中使用它?我有一个很大的单位转换库,我希望它可以在我的模板上使用。
$scope.callFoo = myService.foo;
而不是在要使用它的每个位置创建一个新包装。
我猜你也可以把它们结合起来:
<!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>
$rootScope
吗?
尽管第一种方法被提倡为“类似角度”方法,但我认为这会增加开销。
考虑是否要在10个不同的控制器中使用此myservice.foo函数。我将必须在所有十个实例中指定此“ myService”依赖项,然后指定$ scope.callFoo范围属性。这仅仅是重复,并且某种程度上违反了DRY原理。
而如果我使用$ rootScope方法,则只指定一次此全局函数gobalFoo,它将在以后的所有控制器中使用,无论有多少个控制器。
AngularJs有“ 服务 ”和“ 工厂 ”只是像yours.These问题曾经有过一些全球控制器,指令,其他服务或任何其他angularjs组件之间的 ..你可以定义函数,存储数据时,请计算功能或任何你想要在服务内部并将其在AngularJs组件中用作Global .like
angular.module('MyModule', [...])
.service('MyService', ['$http', function($http){
return {
users: [...],
getUserFriends: function(userId){
return $http({
method: 'GET',
url: '/api/user/friends/' + userId
});
}
....
}
}])
如果您需要更多
我是Angular的新手,但是我发现有用的方法(非常简单)是我创建了一个全局脚本,该脚本先加载到页面上,然后再使用需要在所有页面上访问的全局变量的本地变量。在该脚本中,我创建了一个名为“ globalFunctions”的对象,并添加了需要全局访问的函数作为属性。例如globalFunctions.foo = myFunc();
。然后,在每个本地脚本中,我编写了代码,$scope.globalFunctions = globalFunctions;
并且可以立即访问添加到全局脚本中的globalFunctions对象的任何函数。
这是一个变通办法,我不确定它是否对您有帮助,但由于我有很多功能,因此将其全部添加到每个页面上确实很痛苦。
module.value('myFunc', function(a){return a;});
然后在控制器中按名称注入它。(如果要避免提供服务)