AngularJS-의존성 주입
종속성 주입은 구성 요소 내에서 하드 코딩하는 대신 구성 요소에 종속성을 부여하는 소프트웨어 디자인입니다. 구성 요소가 종속성을 찾지 못하게하고 종속성을 구성 할 수 있도록합니다. 또한 구성 요소를 재사용, 유지 관리 및 테스트 가능하게 만드는 데 도움이됩니다.
AngularJS는 최고의 의존성 주입 메커니즘을 제공합니다. 종속성으로 서로 주입 할 수있는 다음과 같은 핵심 구성 요소를 제공합니다.
- Value
- Factory
- Service
- Provider
- Constant
값
Value는 구성 단계에서 컨트롤러에 값을 전달하는 데 필요한 간단한 JavaScript 객체입니다 (구성 단계는 AngularJS가 자체적으로 부트 스트랩하는 단계입니다).
//define a module
var mainApp = angular.module("mainApp", []);
//create a value object as "defaultInput" and pass it a data.
mainApp.value("defaultInput", 5);
...
//inject the value in the controller using its name "defaultInput"
mainApp.controller('CalcController', function($scope, CalcService, defaultInput) {
$scope.number = defaultInput;
$scope.result = CalcService.square($scope.number);
$scope.square = function() {
$scope.result = CalcService.square($scope.number);
}
});
공장
Factory는 값을 반환하는 데 사용되는 함수입니다. 서비스 또는 컨트롤러가 필요할 때마다 필요에 따라 가치를 생성합니다. 일반적으로 공장 함수를 사용하여 값을 계산하고 반환합니다.
//define a module
var mainApp = angular.module("mainApp", []);
//create a factory "MathService" which provides a method multiply to return multiplication of two numbers
mainApp.factory('MathService', function() {
var factory = {};
factory.multiply = function(a, b) {
return a * b
}
return factory;
});
//inject the factory "MathService" in a service to utilize the multiply method of factory.
mainApp.service('CalcService', function(MathService) {
this.square = function(a) {
return MathService.multiply(a,a);
}
});
...
서비스
서비스는 특정 작업을 수행하기위한 함수 집합을 포함하는 단일 JavaScript 개체입니다. 서비스는 service () 함수를 사용하여 정의되고 컨트롤러에 주입됩니다.
//define a module
var mainApp = angular.module("mainApp", []);
...
//create a service which defines a method square to return square of a number.
mainApp.service('CalcService', function(MathService) {
this.square = function(a) {
return MathService.multiply(a,a);
}
});
//inject the service "CalcService" into the controller
mainApp.controller('CalcController', function($scope, CalcService, defaultInput) {
$scope.number = defaultInput;
$scope.result = CalcService.square($scope.number);
$scope.square = function() {
$scope.result = CalcService.square($scope.number);
}
});
공급자
Provider는 구성 단계에서 서비스, 팩토리 등을 생성하기 위해 AngularJS에서 내부적으로 사용됩니다. 다음 스크립트는 앞서 생성 한 MathService를 생성하는 데 사용할 수 있습니다. Provider는 값 / 서비스 / 팩토리를 반환하는 데 사용되는 get () 메서드가있는 특수 팩토리 메서드입니다.
//define a module
var mainApp = angular.module("mainApp", []);
...
//create a service using provider which defines a method square to return square of a number.
mainApp.config(function($provide) {
$provide.provider('MathService', function() {
this.$get = function() {
var factory = {};
factory.multiply = function(a, b) {
return a * b;
}
return factory;
};
});
});
일정한
구성 단계에서는 값을 사용할 수 없다는 사실을 고려하여 구성 단계에서 값을 전달하는 데 상수가 사용됩니다.
mainApp.constant("configParam", "constant value");
예
다음 예제는 위에서 언급 한 모든 지시문의 사용을 보여줍니다-
testAngularJS.htm
<html>
<head>
<title>AngularJS Dependency Injection</title>
</head>
<body>
<h2>AngularJS Sample Application</h2>
<div ng-app = "mainApp" ng-controller = "CalcController">
<p>Enter a number: <input type = "number" ng-model = "number" /></p>
<button ng-click = "square()">X<sup>2</sup></button>
<p>Result: {{result}}</p>
</div>
<script src = "https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js">
</script>
<script>
var mainApp = angular.module("mainApp", []);
mainApp.config(function($provide) {
$provide.provider('MathService', function() {
this.$get = function() {
var factory = {};
factory.multiply = function(a, b) {
return a * b;
}
return factory;
};
});
});
mainApp.value("defaultInput", 5);
mainApp.factory('MathService', function() {
var factory = {};
factory.multiply = function(a, b) {
return a * b;
}
return factory;
});
mainApp.service('CalcService', function(MathService) {
this.square = function(a) {
return MathService.multiply(a,a);
}
});
mainApp.controller('CalcController', function($scope, CalcService, defaultInput) {
$scope.number = defaultInput;
$scope.result = CalcService.square($scope.number);
$scope.square = function() {
$scope.result = CalcService.square($scope.number);
}
});
</script>
</body>
</html>
산출
웹 브라우저에서 testAngularJS.htm 을 열고 결과를 확인합니다.