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


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.