유틸리티 함수가있는 경우 선언 foo
내 어디에서나 호출 할 수 있습니다 ng-app
. 어쨌든 모듈 설정에서 전역 적으로 액세스 할 수 있습니까? 아니면 모든 컨트롤러의 범위에 추가해야합니까?
유틸리티 함수가있는 경우 선언 foo
내 어디에서나 호출 할 수 있습니다 ng-app
. 어쨌든 모듈 설정에서 전역 적으로 액세스 할 수 있습니까? 아니면 모든 컨트롤러의 범위에 추가해야합니까?
답변:
기본적으로 서비스로 정의하거나 루트 범위에 배치하는 두 가지 옵션이 있습니다. 루트 범위를 오염시키지 않도록 서비스를 제공하는 것이 좋습니다. 서비스를 작성하고 다음과 같이 컨트롤러에서 사용 가능하게하십시오.
<!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
있습니까?
첫 번째 접근법은 '각도 같은'접근법으로 옹호되지만 이것이 오버 헤드를 추가한다고 생각합니다.
이 myservice.foo 함수를 10 개의 다른 컨트롤러에서 사용하고 싶은지 고려하십시오. 이 'myService'종속성을 지정한 다음 열 범위에서 $ scope.callFoo 범위 속성을 지정해야합니다. 이것은 단순히 반복이며 어떻게 든 DRY 원칙을 위반합니다.
반면 $ rootScope 접근 방식을 사용하면이 전역 함수 gobalFoo를 한 번만 지정하면 아무리 많은 미래 컨트롤러에서도 사용할 수 있습니다.
AngularJS와는 "이 서비스 "와 " 공장 글로벌 뭔가가하는 데 사용되는 단지 yours.These 같은 문제를" 컨트롤러, 지침, 기타 서비스 또는 기타 AngularJS와 구성 요소 사이의 ..You 함수를 정의 할 수 있습니다, 데이터를 저장, 메이크업의 계산 기능 또는 당신이 무엇을 내부 서비스를 원 하고 AngularJs 구성 요소에서 전역으로 사용하십시오 .
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;});
컨트롤러에 이름으로 주입하십시오. (서비스를 원치 않는 경우)