Як я можу перевірити послугу AngularJS з консолі?


395

У мене є така послуга, як:

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

Я хотів би перевірити його з консолі JavaScript і викликати функціюf1() сервісу.

Як я можу це зробити?

Відповіді:


713

TLDR: В одному рядку потрібна команда:

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

Глибоке занурення

AngularJS використовує Dependency Injection (DI) для введення служб / заводів у ваші компоненти, директиви та інші послуги. Отже, що вам потрібно зробити, щоб отримати послугу, - це отримати інжектор AngularJS (інжектор відповідає за з'єднання всіх залежностей та надання їх компонентам).

Щоб отримати інжектор вашої програми, вам потрібно схопити його з елемента, яким керує кут. Наприклад, якщо ваш додаток зареєстровано на елементі тіла, який ви телефонуєтеinjector = angular.element(document.body).injector()

З отриманого injectorви зможете отримати будь-яку послугу, яку вам подобаєтьсяinjector.get('ServiceName')

Більше інформації про це у цій відповіді: Неможливо отримати інжектор з кутового
та ще більше тут: Зателефонуйте AngularJS зі застарілого коду


Ще один корисний трюк для отримання $scopeпевного елемента. Виберіть елемент за допомогою інструмента перевірки DOM інструментів для розробників, а потім запустіть наступний рядок ( $0це завжди вибраний елемент):
angular.element($0).scope()


70
Я також повинен був зробити це, щоб він працював. До речі, angular.element('*[ng-app]').injector()повинна працювати у всіх випадках.
Francesc Rosas

4
Якщо ви отримуєте помилки "селектори не реалізовані", виконуючи angular.element ("html"), ви можете скористатися функцією Chrome $ 0. Виберіть html-елемент, перейдіть до консолі та запустіть angular.element ($ 0) .injector ()
Marek

9
documentтакож працює:angular.element(document).injector().get('serviceName')
Тамлін

1
FYI Мені довелося скористатися document.body на хромі
Кевін

5
FYI Я хотів скористатися послугою $ location, але в кінцевому підсумку мені потрібно було завернути його у application.apply. Я знаю, що це добре задокументовано, але це прослізнуло мені. В одному рядку angular.element (document) .scope (). $ Apply (angular.element (document) .injector (). Get ('$ location'). Path ('/ my /
angular

25

Перш за все, модифікована версія вашої послуги.

а)

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

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

Це повертає об'єкт, нічого нового тут.

Тепер спосіб отримати це з консолі

б)

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

в)

Однією з речей, які ви робили там раніше, було припускати, що app.factory повертає вам саму функцію або нову версію її. Що не так. Для того, щоб отримати конструктор, вам або доведеться це зробити

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

Це повертає конструктор ExampleService, для якого вам доведеться зробити "новий".

Або ж,

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

Це повертає новий ExampleService () при ін'єкції.


3
коли я це роблю, var $inj = angular.injector(['app']);тоді консоль кидає Error: Unknown provider: $filterProvider from appв один додаток, а Error: Unknown provider: $controllerProvider from appв інший додаток ...
JustGoscha

@JustGoscha Як налаштовано ваш додаток? тобто як виглядає рядок (що виглядає) var app = angular.module ('app', []); виглядати як у вашому додатку.
ganaraj

Я не зовсім розумію питання .. це виглядає так, як ви говорите, angular.module('app',[]);і тоді в різних файлах є служби, контролери тощо, і всі вони визначені як, angular.module('app').factory('FeatureRegistry',function(){//code here});наприклад,
JustGoscha

@JustGoscha Ось що я зробив для тестування. Я перейшов на docs.angularjs.org/api в хромі. Відкрив консоль. Введіть код у розділі а моєї відповіді, а потім набрав код у розділі b .. Ви повинні побачити Hello World .. Чи можете ви спробувати це?
ganaraj

14

@ Відповідь JustGoscha не ввімкнена, але це дуже багато для набору, коли я хочу отримати доступ, тому я додав це в нижній частині мого app.js. Тоді все, що мені потрібно набрати - x = getSrv('$http')це отримати послугу http.

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

Це додає його до глобальної сфери, але лише в режимі налагодження. Я поміщаю його всередину, @if DEBUGщоб я не закінчився цим у виробничому коді. Я використовую цей метод для видалення коду налагодження з нарощування гордості.


4

Angularjs Dependency Innjection Framework відповідає за те, щоб вводити залежності вашим модулем програми до ваших контролерів. Це можливо через його інжектор.

Потрібно спочатку визначити ng-додаток та отримати відповідний інжектор. Наведений нижче запит працює для пошуку вашого ng-додатка в DOM та отримання інжектора.

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

Однак у хромі можна вказати на ng-додаток, як показано нижче. і використовувати $0хак і видаватиangular.element($0).injector()

Отримавши інжектор, отримайте будь-яку службу введення залежності, як показано нижче

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

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.