Прежде всего, это честный вопрос. И я ищу честных и обоснованных ответов о том, почему я не должен делать это ...
angular
.module('X', ['Y'])
.config(function (myFactoryProvider, myServiceProvider) {
myFactoryProvider.$get().myFn();
myServiceProvider.$get().myFn();
});
angular
.module('Y', [])
.factory('myFactory', ['$location', function ($location) {
return {
myFn: function() {
console.log('factory');
console.log($location.absUrl());
}
}
}])
.service('myService', ['$location', function ($location) {
this.myFn = function() {
console.log('service');
console.log($location.absUrl());
}
}]);
Вот JSFiddle: http://jsfiddle.net/1vetnu6o/
Это работает, как вы можете видеть выше, и решает несколько проблем для меня. Но я, наверное, не должен этого делать, и я хочу понять, почему. Мне действительно нужны веские причины не делать этого. Несмотря на то, что я действительно этого хочу.
tl; dr;
Вот контекст проблемы ...
У меня есть этот внутренний каркас, используемый несколько продуктов, где есть эта услуга (что случается завод), который в основном содержит группу взаимосвязанных вспомогательных методов. В этом случае устройство, связанное как isMobileDevice
, isAndroid
, getDeviceType
(с возвращениями mobile
, tablet
или desktop
), и некоторыми другими ...
Этой услуга должна быть введена в config()
фазу приложения с использованием рамок, потому что нам нужен доступ к функции getDeviceType
. Дело в том, что мы должны получить deviceType
для загрузки соответствующих шаблонов с помощью $routeProvider
. На этапе config()
мы создаем правильные пути шаблонов, которые будут использоваться для всех маршрутов. Некоторые из них зависят от deviceType
, в то время как другие имеют общий шаблон, не зависящий от устройства.
Поскольку это сервис, мы не можем вводить его непосредственно в фазу config()
, но мы можем вызвать этот метод, используя технику, о которой я упоминал ранее в сообщении.
Как я в настоящее время решаю это? Служба-помощник на самом деле является поставщиком, и все методы отображаются как в разделе поставщика, так и в заводской функции. Не идеальный, но он работает. Я считаю это обходным, но я предпочел бы работать в приложении, а не в рамках, таким образом, впервые упомянутый метод.
Мысли?