Đ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 configgiai đ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 configphần được thực thi. Các configphầ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 rungiai đoạn, tất cả các runphầ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 rungiai đoạn này, bạn có thể sử dụng / tiêm dịch vụ .
Ví dụ:
1. Tiêm $httpdị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 $httpdịch vụ vào một hàm được thực thi trong configgiai đ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 $httpProvidercái được sử dụng để tạo $httpdịch vụ vẫn chưa sẵn sàng (vì chúng tôi vẫn đang trong configgiai đoạn).
2. Đưa $httpdị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 rungiai đoạn mã này sẽ hoạt động.