Ответ 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, которые будут созданы во время вашего приложения. Если вы используете эту опцию, и любые службы или так, чтобы они явно не были аннотированы, они не сработают во время создания экземпляра.