모든 컨트롤러에서 기능을 각도로 사용할 수 있습니까?


191

유틸리티 함수가있는 경우 선언 foo내 어디에서나 호출 할 수 있습니다 ng-app. 어쨌든 모듈 설정에서 전역 적으로 액세스 할 수 있습니까? 아니면 모든 컨트롤러의 범위에 추가해야합니까?


나는 이것에 대해 100 % 확신하지 못하지만 모듈에서 다음과 같이 정의 할 수 있습니다 : module.value('myFunc', function(a){return a;});컨트롤러에 이름으로 주입하십시오. (서비스를 원치 않는 경우)
user2173353

모든 컨트롤러에 수동으로 추가해야한다는 것을 의미합니다. $ rootScope 내가 거의 2 년 전하고 싶었던 것을 위해 길을 가야하는 것입니다 =)
루드비히 그누

확인. :) 나는 단지 일반 컨트롤러보다 고립 된 범위의 지시어를 더 자주 사용하고 어쨌든 모든 것을 주입해야합니다. 나는 이것이 제공하는 모듈 식 코드 스타일을 좋아한다. 또한 어떤 식 으로든 부모 범위를 망칠 필요가 없으며 범위 변수의 출처를 많이 검색 할 필요가 없습니다. :)
user2173353

답변:


290

기본적으로 서비스로 정의하거나 루트 범위에 배치하는 두 가지 옵션이 있습니다. 루트 범위를 오염시키지 않도록 서비스를 제공하는 것이 좋습니다. 서비스를 작성하고 다음과 같이 컨트롤러에서 사용 가능하게하십시오.

<!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()템플릿을 컨트롤러에서 템플릿으로 전달하지 않고도 호출 할 수 있습니다 .


5
첫 번째 솔루션에서 수많은 foo()기능 이 있다면 어떨까요? $scope.callFoo()그들 모두를 위해 래퍼를 만드는 것은 너무 많은 일입니다. 템플릿에서 사용할 수 있도록 라이브러리의 모든 기능을 범위에 "연결" 하는 방법은 무엇입니까? 템플릿에서 사용할 수있는 큰 단위 변환 라이브러리가 있습니다.
AlexStack

3
내 질문도 나는 이것을 시도하고 작동한다 : 당신은 그것을 $scope.callFoo = myService.foo;사용하고자하는 각 장소에 새로운 래퍼를 생성하는 대신 말함으로써 그것을 "첨부"할 수 있습니다 .
Fitter Man

1
도와 주셔서 감사합니다. 내 앱 전체에서 언어 변경 기능을 사용 가능하게 만드는 방법이 궁금했고 $ rootScope가 그 일을했습니다. 번역 모듈을 응용 프로그램과 분리하여 다른 응용 프로그램에도 연결할 수 있기를 원했습니다.
Paulo Pedroso

서비스 내에서 여러 기능을 계획하지 않는 한이 특정 사례에는 팩토리가 아닌 각도 값을 사용하는 것이 좋습니다. 함수가 하나 인 경우 Value로 만드십시오.
Nicholas Blasgen

오류가 발생했습니다 : [$ injector : unpr]
Mark Thien

53

당신은 또한 내가 생각하는 그들을 결합 할 수 있습니다 :

<!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>

7
나는 이것이 @Praym의 대답으로 정당화 된 정답이어야한다고 생각합니다. 10 개의 다른 컨트롤러에서 서비스 종속성을 지정하는 것은 의미가 없습니다.
jvannistelrooy 2014

서비스에서 속성 / 변수를 CRUD 할 수있는 메소드 / 함수를 포함 할 수 $rootScope있습니까?
jezmck

44

첫 번째 접근법은 '각도 같은'접근법으로 옹호되지만 이것이 오버 헤드를 추가한다고 생각합니다.

이 myservice.foo 함수를 10 개의 다른 컨트롤러에서 사용하고 싶은지 고려하십시오. 이 'myService'종속성을 지정한 다음 열 범위에서 $ scope.callFoo 범위 속성을 지정해야합니다. 이것은 단순히 반복이며 어떻게 든 DRY 원칙을 위반합니다.

반면 $ rootScope 접근 방식을 사용하면이 전역 함수 gobalFoo를 한 번만 지정하면 아무리 많은 미래 컨트롤러에서도 사용할 수 있습니다.


5
컨트롤러가 글로벌 서비스 요청을받는 '문서'에 가치가있을 수 있습니다. 컨트롤러 중 하나를 다른 응용 프로그램에 넣은 경우 해당 전역 기능의 출처가 명확하지 않습니다. 그래도 당신의 주장을 인정한다고 들었습니다.
Matthew Payne

뷰에서 호출해야하는 경우에만 범위에 배치해야합니다. 컨트롤러에서 서비스에서 직접 호출 할 수 있습니다.
mcv

10
이것은 답변이 아닙니다 댓글
Elliott

이 경우 페이지를 새로 고칠 때 $ rootScope 변수는 항상 null입니다. 그렇기 때문에 서비스를 주입하고 응용 프로그램에서 참조를 사용하는 것이 좋습니다.
Ehsan Hafeez

4

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

더 필요한 경우

왜 AngularJs 서비스 및 팩토리가 필요한지 더 자세히 알아보십시오


0

나는 Angular에 대해 조금 더 새로운 것이지만 내가하는 유용한 (그리고 매우 간단한) 것은 전역 스크립트를 로컬 스크립트보다 먼저 모든 페이지에서 액세스 해야하는 전역 변수로 내 페이지에로드하는 전역 스크립트를 만든 것입니다. 이 스크립트에서 "globalFunctions"라는 객체를 만들고 전역 적으로 속성으로 액세스해야하는 함수를 추가했습니다. 예 globalFunctions.foo = myFunc();. 그런 다음 각 로컬 스크립트에서 작성 $scope.globalFunctions = globalFunctions;하고 전역 스크립트의 globalFunctions 객체에 추가 한 모든 기능에 즉시 액세스 할 수 있습니다.

이것은 약간의 해결 방법이며 도움이 될지 확실하지 않지만 많은 기능을 가지고있어 각 페이지에 모든 기능을 추가하는 데 어려움이있었습니다.


1
왜 다운 보트가 궁금한가요? 나는 새롭고 전문가로부터 알고 싶습니다.
Izzy

나에게 작동하는 솔루션 인 것 같습니다. 범위를 충분히 격리하기 위해 내가 주장하는 유일한 것은 전역 루트 Javascript 유틸리티 클래스를 만들고 유틸리티 메소드를 중단하여 실수로 다른 함수 이름을 밟지 않도록하는 것입니다. Angular가 주입 한 광대 한 바다.
JE Carter II

한 가지 주목할 점은 아마도 이것이 다운 투표 된 이유는 함수 호출이 컴파일 타임에 해결되지 않기 때문에 .ts 모듈이 아닌 템플릿에서 해당 기능 만 사용할 수 있다는 것입니다. 이것이 "각도"방식으로하는 이유입니다. 그러나 데코레이터 등을 템플릿에 추가하려는 경우 전역 유틸리티 파일은 간단하고 훌륭합니다.
JE Carter II
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.