Làm cách nào tôi có thể kiểm tra dịch vụ AngularJS từ bảng điều khiển?


395

Tôi có một dịch vụ như:

angular.module('app').factory('ExampleService', function(){
  this.f1 = function(world){
    return 'Hello '+world;
  }
  return this;
})

Tôi muốn kiểm tra nó từ bảng điều khiển JavaScript và gọi chức năng f1()của dịch vụ.

Làm thế nào tôi có thể làm điều đó?

Câu trả lời:


713

TLDR: Trong một dòng lệnh bạn đang tìm kiếm:

angular.element(document.body).injector().get('serviceName')

Lặn sâu

AngularJS sử dụng Dependency Injection (DI) để tiêm các dịch vụ / nhà máy vào các thành phần, chỉ thị và các dịch vụ khác của bạn. Vì vậy, những gì bạn cần làm để có được một dịch vụ là lấy đầu phun của AngularJS trước (đầu phun có trách nhiệm nối tất cả các phụ thuộc và cung cấp chúng cho các thành phần).

Để có được phun của ứng dụng của bạn, bạn cần phải lấy nó từ một yếu tố mà góc được xử lý. Ví dụ: nếu ứng dụng của bạn được đăng ký trên thành phần cơ thể bạn gọiinjector = angular.element(document.body).injector()

Từ truy xuất, injectorbạn có thể nhận bất kỳ dịch vụ nào bạn thích vớiinjector.get('ServiceName')

Thông tin thêm về câu trả lời này: Không thể truy xuất kim phun từ góc
và thậm chí nhiều hơn ở đây: Gọi AngularJS từ mã kế thừa


Một mẹo hữu ích khác để có được $scopemột yếu tố cụ thể. Chọn phần tử với công cụ kiểm tra DOM của các công cụ dành cho nhà phát triển của bạn và sau đó chạy dòng sau ( $0luôn là phần tử được chọn):
angular.element($0).scope()


70
Tôi cũng đã phải làm điều này để làm cho nó hoạt động. BTW, angular.element('*[ng-app]').injector()nên làm việc cho tất cả các trường hợp.
Francesc Rosas

4
Nếu bạn gặp lỗi 'bộ chọn không được triển khai' thực thi angular.element ('html') thì bạn có thể sử dụng tính năng Chrome $ 0. Chọn phần tử html, đi tới bảng điều khiển và chạy angular.element ($ 0) .injection ()
Marek

9
documentcũng hoạt động:angular.element(document).injector().get('serviceName')
Tamlyn

1
FYI Tôi đã phải sử dụng document.body trên chrome
Kevin

5
FYI Tôi muốn sử dụng dịch vụ định vị $, nhưng cuối cùng tôi cần phải bọc nó trong scope.apply. Tôi biết điều này là tài liệu tốt, nhưng nó đã trượt tâm trí của tôi. Trong một dòng angular.element (document) .scope (). $ Áp dụng (angular.element (document) .injection (). Get ('$ location'). Path ('/ my / angular / url'))
acid_crucifix

25

Trước hết, một phiên bản sửa đổi của dịch vụ của bạn.

a)

var app = angular.module('app',[]);

app.factory('ExampleService',function(){
    return {
        f1 : function(world){
            return 'Hello' + world;
        }
    };
});

Điều này trả về một đối tượng, không có gì mới ở đây.

Bây giờ cách để có được điều này từ bảng điều khiển là

b)

var $inj = angular.injector(['app']);
var serv = $inj.get('ExampleService');
serv.f1("World");

c)

Một trong những điều bạn đang làm ở đó trước đó là giả định rằng app.factory trả về cho bạn chức năng hoặc phiên bản mới của nó. Đó không phải là trường hợp. Để có được một constructor, bạn sẽ phải làm

app.factory('ExampleService',function(){
        return function(){
            this.f1 = function(world){
                return 'Hello' + world;
            }
        };
    });

Điều này trả về một hàm tạo của Ví dụ dịch vụ mà tiếp theo bạn sẽ phải thực hiện 'mới' trên.

Hay cách khác,

app.service('ExampleService',function(){
            this.f1 = function(world){
                return 'Hello' + world;
            };
    });

Điều này trả về exampleService () mới khi tiêm.


3
Khi tôi làm var $inj = angular.injector(['app']);thì bảng điều khiển sẽ ném một Error: Unknown provider: $filterProvider from apptrong một ứng dụng và Error: Unknown provider: $controllerProvider from apptrong một ứng dụng khác ...
JustGoscha

@JustGoscha Ứng dụng của bạn được cấu hình như thế nào? tức là Làm thế nào để một dòng (trông giống như) var app = angular.module ('app', []); trông giống như trong ứng dụng của bạn.
ganaraj

Tôi không hoàn toàn hiểu câu hỏi .. có vẻ như bạn nói angular.module('app',[]);và sau đó có các dịch vụ, bộ điều khiển, v.v. trong các tệp khác nhau và tất cả chúng đều được định nghĩa như angular.module('app').factory('FeatureRegistry',function(){//code here});ví dụ
JustGoscha

@JustGoscha Đây là những gì tôi đã làm để kiểm tra. Tôi đã truy cập docs.angularjs.org/api bằng chrome. Mở bàn điều khiển. Nhập mã trong phần a trong câu trả lời của tôi và sau đó nhập mã trong phần b .. Bạn sẽ thấy Hello World .. Bạn có thể thử không?
ganaraj

14

Câu trả lời của @ JustGoscha là tại chỗ, nhưng đó là rất nhiều để gõ khi tôi muốn truy cập, vì vậy tôi đã thêm câu này vào cuối app.js của tôi. Sau đó, tất cả tôi phải gõ là x = getSrv('$http')để có được dịch vụ http.

// @if DEBUG
function getSrv(name, element) {
    element = element || '*[ng-app]';
    return angular.element(element).injector().get(name);
}
// @endif

Nó thêm nó vào phạm vi toàn cầu nhưng chỉ trong chế độ gỡ lỗi. Tôi đặt nó bên trong @if DEBUGđể tôi không kết thúc nó trong mã sản xuất. Tôi sử dụng phương pháp này để loại bỏ mã gỡ lỗi khỏi các bản dựng prouduction.


4

Angularjs Dependency Injection framework chịu trách nhiệm tiêm các phần phụ thuộc của mô-đun ứng dụng vào bộ điều khiển của bạn. Điều này có thể thông qua kim phun của nó.

Trước tiên, bạn cần xác định ng-app và lấy kim phun liên quan. Truy vấn dưới đây hoạt động để tìm ứng dụng ng của bạn trong DOM và truy xuất trình tiêm.

angular.element('*[ng-app]').injector()

Tuy nhiên, trong chrome, bạn có thể trỏ đến mục tiêu ng-app như hiển thị bên dưới. và sử dụng $0hack và vấn đềangular.element($0).injector()

Khi bạn có người tiêm, hãy lấy bất kỳ dịch vụ tiêm phụ thuộc nào như dưới đây

injector = angular.element($0).injector();
injector.get('$mdToast');

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.