6

의존성 주입을 배우는 것만으로도 이해할 수있을 것 같습니다.AngularJS 컨트롤러의 의존성 주입 이해하기

내가 곧 정상 궤도에있어 경우

예컨대 :

이 두 동일합니다 ... 알려주세요?

/* injection method */ 
function <controller_name>($scope) {} 
<controller_name>.$inject = ['$scope']; 

/* other method */ 
var app = angular.module('myApp'); 
app.controller(<controller_name>, function($scope) {}); 

답변

12

먼저 약간 설명 : 당신은 전역 함수 또는 module.controller(...)있어서의 인자로를 사용하여 제어기를 선언 여부

의존성 주입의 경우, 문제가되지 않는다. 의존성 인젝터는 기능 자체에만 관심이 있습니다. 그래서 당신이 실제로에 대해 요구하고하는 것은 두의 동등성은 다음과 같습니다

// First 

function MyController($scope) {} 

MyController.$inject = [ '$scope ']; 

// Second 

function($scope) {} 

그리고 컨트롤러 기능은 인젝터 문제가되지 않는 익명인지 여부, 위의 두 단지뿐만 아니라 수 있기 때문에 :

// First 

function MyController($scope) {} 

MyController.$inject = [ '$scope ']; 

// Second 

function MyController($scope) {} 

지금 당신의 두 컨트롤러 사이의 유일한 차이는 그들 중 하나에서 $inject 속성의 존재임을 분명하다.

그리고 여기에 귀하의 질문에 대한 실제 대답 :

이 두 컨트롤러는 거의 동일합니다. 둘 다 인수로 $scope을 수신하며 동일한 기능을합니다. 그러나 나중에 코드를 축소하기로 결정한 경우 $inject 배열이 설정된 버전 만 제대로 작동합니다. $inject 배열을 지정하지 않거나 인라인 주석 접근법 (http://docs.angularjs.org/guide/di#inlineannotation)을 사용하지 않으면 인젝터가 관심있는 종속성을 확인하는 유일한 방법은 함수 인수의 이름을 확인하는 것입니다. 서비스 ID). 그러나 minification은 이러한 주장을 무작위로 명명하여 이런 식으로 의존성을 인식 할 수있는 기회를 제거합니다.

코드를 축소 할 경우 $inject 배열 또는 인라인 주석을 사용하여 명시 적으로 종속성을 지정해야합니다. 그렇지 않으면 모든 버전이 정상적으로 작동합니다. 당신이 module.controller 방법을 사용하려고하는 경우

7

, 첫 번째 예에 동등은 다음과 같습니다

var app = angular.module('myApp'); 
app.controller(<controller_name>, ['$scope', function($scope) {}]); 

주의가 이런 식으로 우리가 만약 있도록 기능과 함께 $inject 문자열을 전달하고 나중에는 최소화되어 여전히 작동 할 것입니다.

+0

감사합니다.하지만'$ http'와는 작동하지 않습니다 ... 여기에 대한 질문 : http://stackoverflow.com/q/16664325 – user2283066