Hôm nay tôi thấy rằng $injector
được tiêm vào cấu hình hoặc nhà cung cấp khác với $injector
được tiêm vào dịch vụ, nhà máy hoặc bộ điều khiển.
Và get()
chức năng từ $ kim phun này hoạt động khác nhau.
$injector
từ cấu hình hoặc nhà cung cấp, không thể get()
bất kỳ dịch vụ nào! $injector.get('myService')
ném Error: [$injector:unpr] Unknown provider: myService
, nhưng $injector.has('myService')
trả về giá trị đúng. Điều đó rất lạ.
$injector
từ dịch vụ hoặc bộ điều khiển hoạt động bình thường.
Đây là một mẫu mã cho sự hiểu biết tốt hơn:
angular.module('app', [])
.provider('myProvider', function ($injector) {
this.$get = ['$injector', function (serviceInjector) {
return {
providerInjector: $injector,
serviceInjector: serviceInjector
};
}];
})
.service('myService', function() {})
.controller('myCtrl', function ($scope, myProvider) {
var providerInjector = myProvider.providerInjector;
var serviceInjector = myProvider.serviceInjector;
console.log(providerInjector === serviceInjector); // -> false
console.log(serviceInjector.has('myService')); // `serviceInjector` has `myService`
console.log(getMyService(serviceInjector)); // `serviceInjector` can get `myService`
console.log(providerInjector.has('myService')); // `providerInjector` has `myService` too!
console.log(getMyService(providerInjector)); // but `providerInjector` can't get `myService`! =(
function getMyService(injector) {
try {
injector.get('myService');
return "OK";
} catch (e) {
return e.toString();
}
}
});
Ai có thể giải thích tại sao có hai kim phun khác nhau?
Và làm cách nào tôi có thể sử dụng $ injector từ nhà cung cấp/cấu hình để dịch vụ tiêm (sau khi dịch vụ đã được khởi tạo, tất nhiên)?
P.S. Tôi sử dụng góc nghiêng 1.3.13
Câu hỏi của bạn có một chút không rõ ràng. Bạn muốn đạt được gì trong nhà cung cấp/cấu hình? Bạn có thể cung cấp cho một trường hợp sử dụng? –
Trường hợp sử dụng? Ví dụ: nhận dịch vụ thông qua $ injector trong phần cấu hình. Hoặc nhà cung cấp. Sau khi khởi tạo dịch vụ, tất nhiên. Trong trường hợp của tôi (nó rất phức tạp để hiển thị) tôi thêm callbacks cho nhà cung cấp trong phần cấu hình. Và trong gọi lại, tôi muốn sử dụng dịch vụ của mình. DI không thể giúp tôi với điều đó, vì vậy tôi sử dụng $ injector. Gọi lại này sẽ được gọi từ bộ điều khiển, khi dịch vụ đã được khởi tạo. –