AngularJS и Typescript - Инъекционные услуги

Я уже давно писал приложения AngularJS, но Typescript для меня новичок, а затем добавление в AngularJS к Typescript немного отличается от того, что я использую.

В любом случае, какая разница между ними:

app.service('customerDataService', Application.Services.CustomerDataService);

и

app.service('customerDataService', ['$http', '$q', Application.Services.CustomerDataService]);

Контроллер TS

module Application {
    export module Services {
        export interface ICustomerDataService {
            getCustomer(id: number): ng.IPromise<Models.ICustomer>;
        }

        export class CustomerDataService implements ICustomerDataService {
            constructor(private $http: ng.IHttpService, private $q: ng.IQService) {
            }

            getCustomer(id: number): ng.IPromise<Models.ICustomer> {
                return this.$http.get('data/Customer.json').then((response) => {
                    return response.data;
                });
            }
        }
    }
}

App TS

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

app.value('config', new Application.ApplicationConfig());

app.service('customerDataService', ['$http', '$q', Application.Services.CustomerDataService]);
app.service('customerDataService', Application.Services.CustomerDataService);

app.controller('DefaultController', ['$scope','config', 'customerDataService', Application.Controllers.DefaultController]);
Они оба работают. Нужно ли явно указывать инъекции для службы?

Ответ 1

При минимизации кода вам необходимо вводить зависимости для службы или любых других angular сущностей (поставщиков, фабрик, контроллеров и т.д.). В неминифицированном коде да оба подхода будут работать.

Рассмотрим конструктор: -

 constructor(private $http: ng.IHttpService, private $q: ng.IQService) {
 }

Случай 1 [Явная аннотация зависимостей]: -

app.service('customerDataService', ['$http', '$q', Application.Services.CustomerDataService]);

Никаких проблем с минимизацией, поскольку даже если minifier изменяет $http на a и $q на b, чтобы сказать b, он все равно будет работать, потому что angular будет внутренне использовать аннотацию для получения зависимостей из массива, который вы предоставляете для определения службы.

Случай 2 [неявные зависимости]: -

app.service('customerDataService', Application.Services.CustomerDataService);

В этом случае, если $http изменяет значение a и $q изменяется на b angular, он будет искать aProvider и bProvider при создании экземпляра вашей службы, и, в конечном счете, приложение будет терпеть неудачу при запуске с миниатюрные файлы, поскольку ничего не было указано в качестве зависимостей. angular анализатор должен будет проанализировать определения метода и имена аргументов метода, чтобы обнаружить зависимости.

Другим способом, которым вы можете вводить зависимости, является использование свойства $inject, определенного для функции (cTor) (а не экземпляра). Вы можете: -

    export class CustomerDataService implements ICustomerDataService {
        static $inject = ['$http', '$q']; //<-- Inject here

        constructor(private $http: ng.IHttpService, private $q: ng.IQService) {
      }
      ....

и просто: -

   app.service('customerDataService', Application.Services.CustomerDataService);

И перечисление зависимостей иногда также помогает использовать альтернативное имя для имен аргументов с введенными аргументами. Если вы не хотите делать все это, и ваш код работает с minifier, вы можете пойти с библиотекой ng-annotate.


С angular 1.3 rc существует опция strict-di, которую вы можете указать с помощью rootElement, чтобы принудительно вводить явно аннотированную инъекцию зависимостей на любом услугу или любые объекты angular, которые будут созданы во время вашего приложения. Если вы используете эту опцию, и любые службы или так, чтобы они явно не были аннотированы, они не сработают во время создания экземпляра.

Ответ 2

оба одинаковы, но во время минификсации в вашем первом варианте ур код будет разорен, так как логика минимизации изменит имя зависимостей поэтому во втором варианте u дайте массив зависимостей, которые аллокатор не будет касаться