-
Notifications
You must be signed in to change notification settings - Fork 170
Expand file tree
/
Copy pathdev_guide.services.injecting_controllers.ngdoc
More file actions
114 lines (98 loc) · 4.93 KB
/
dev_guide.services.injecting_controllers.ngdoc
File metadata and controls
114 lines (98 loc) · 4.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
@ngdoc overview
@name Developer Guide: Angular Services: Сервисы в контроллерах
@description
Использование сервисов в качестве зависимостей для контроллеров очень похоже на использование сервисов в качестве зависимостей других сервисов.
Так как JavaScript является динамическим языком, DI не может понять, какие сервисы внедрены статическими
типами (как в статическом типизированных языках). Таким образом, можно указать имя сервиса с помощью свойства
`$inject`, которое является массивом, содержащим строки с названиями сервисов, которые будут внедрены.
Имя должно совпадать с соответствующим идентификатором сервиса, зарегистрированного в Angular. Порядок следования идентификатрово сервисов определяет:
порядок сервисов в массиве, которые будут использованы при вызове фабричной функции с параметрами.
Имена параметров в фабричной функции не имеют значения, но условно они соответствуют идентификаторам сервисов, которые имеют дополнительные преимущества, рассмотренные ниже.
<pre>
function myController($loc, $log) {
this.firstMethod = function() {
// использование сервиса $location
$loc.setHash();
};
this.secondMethod = function() {
// использование сервиса $log
$log.info('...');
};
}
// какой сервис внедрен?
myController.$inject = ['$location', '$log'];
</pre>
<doc:example module="MyServiceModule">
<doc:source>
<script>
angular.
module('MyServiceModule', []).
factory('notify', ['$window', function(win) {
var msgs = [];
return function(msg) {
msgs.push(msg);
if (msgs.length == 3) {
win.alert(msgs.join("\n"));
msgs = [];
}
};
}]);
function myController(scope, notifyService) {
scope.callNotify = function(msg) {
notifyService(msg);
};
}
myController.$inject = ['$scope','notify'];
</script>
<div ng-controller="myController">
<p>Let's try this simple notify service, injected into the controller...</p>
<input ng-init="message='test'" ng-model="message" >
<button ng-click="callNotify(message);">NOTIFY</button>
</div>
</doc:source>
<doc:scenario>
it('should test service', function() {
expect(element(':input[ng\\:model="message"]').val()).toEqual('test');
});
</doc:scenario>
</doc:example>
## Неявное внедрение зависимости
Новая особенностью Angular DI позволяет определить зависимость от названия параметра.
Давайте перепишем приведенный выше пример, чтобы показать использование этого неявного внедрения зависимостей
`$window`, `$scope`, и нашего сервиса `notify`:
<doc:example module="MyServiceModuleDI">
<doc:source>
<script>
angular.
module('MyServiceModuleDI', []).
factory('notify', function($window) {
var msgs = [];
return function(msg) {
msgs.push(msg);
if (msgs.length == 3) {
$window.alert(msgs.join("\n"));
msgs = [];
}
};
});
function myController($scope, notify) {
$scope.callNotify = function(msg) {
notify(msg);
};
}
</script>
<div ng-controller="myController">
<p>Let's try the notify service, that is implicitly injected into the controller...</p>
<input ng-init="message='test'" ng-model="message">
<button ng-click="callNotify(message);">NOTIFY</button>
</div>
</doc:source>
</doc:example>
Тем не менее, если планируется {@link http://en.wikipedia.org/wiki/Minification_(programming) минификация} кода, имена переменных будут переименованы и в этом случае все равно нужно будет явно указать зависимости через свойство `$inject`.
## Связанные разделы
* {@link dev_guide.services.understanding_services Понимание сервисов}
* {@link dev_guide.services.creating_services Создание сервисов}
* {@link dev_guide.services.managing_dependencies Управление зависимостями сервисов}
* {@link dev_guide.services.testing_services Тестирование сервисов}
## Связанное API
{@link api/ng API сервисов}