Điểm mấu chốt là:
- Bạn KHÔNG THỂ đưa một dịch vụ vào phần cấu hình nhà cung cấp .
- Bạn CÓ THỂ đưa một dịch vụ vào phần khởi tạo dịch vụ của nhà cung cấp .
Chi tiết:
Angular framework có quá trình khởi tạo 2 giai đoạn:
GIAI ĐOẠN 1: Cấu hình
Trong config
giai đoạn này, tất cả các trình cung cấp được khởi tạo và tất cả các config
phần được thực thi. Các config
phần có thể chứa mã định cấu hình các đối tượng trình cung cấp và do đó chúng có thể được đưa vào các đối tượng trình cung cấp. Tuy nhiên, vì nhà cung cấp là nhà máy cho các đối tượng dịch vụ và ở giai đoạn này, nhà cung cấp chưa được khởi tạo / cấu hình đầy đủ -> bạn không thể yêu cầu nhà cung cấp tạo dịch vụ cho bạn ở giai đoạn này -> ở giai đoạn cấu hình bạn không thể sử dụng / dịch vụ tiêm . Khi giai đoạn này hoàn thành, tất cả các nhà cung cấp đã sẵn sàng (không thể thực hiện thêm cấu hình nhà cung cấp nào sau khi giai đoạn cấu hình hoàn thành).
GIAI ĐOẠN 2: Chạy
Trong suốt run
giai đoạn, tất cả các run
phần được thực hiện. Ở giai đoạn này, các nhà cung cấp đã sẵn sàng và có thể tạo ra các dịch vụ -> trong run
giai đoạn này, bạn có thể sử dụng / tiêm dịch vụ .
Ví dụ:
1. Tiêm $http
dịch vụ vào chức năng khởi tạo trình cung cấp SẼ KHÔNG hoạt động
//ERRONEOUS
angular.module('myModule').provider('myProvider', function($http) {
// SECTION 1: code to initialize/configure the PROVIDER goes here (executed during `config` phase)
...
this.$get = function() {
// code to initialize/configure the SERVICE goes here (executed during `run` stage)
return myService;
};
});
Vì chúng tôi đang cố gắng đưa $http
dịch vụ vào một hàm được thực thi trong config
giai đoạn này, chúng tôi sẽ gặp lỗi:
Uncaught Error: Unknown provider: $http from services
Lỗi này thực sự nói lên rằng $httpProvider
cái được sử dụng để tạo $http
dịch vụ vẫn chưa sẵn sàng (vì chúng tôi vẫn đang trong config
giai đoạn).
2. Đưa $http
dịch vụ vào chức năng khởi tạo dịch vụ SẼ hoạt động:
//OK
angular.module('myModule').provider('myProvider', function() {
// SECTION 1: code to initialize/configure the PROVIDER goes here (executed during `config` phase)
...
this.$get = function($http) {
// code to initialize/configure the SERVICE goes here (executed during `run` stage)
return myService;
};
});
Vì bây giờ chúng ta đang đưa dịch vụ vào hàm khởi tạo dịch vụ, hàm này được thực thi trong run
giai đoạn mã này sẽ hoạt động.