2015-03-24 1 views
2

Прежде всего, это честный вопрос. И я ищу честных и обоснованных ответов о том, почему я не должен делать это ...

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(), но мы можем вызвать этот метод, используя технику, о которой я упоминал ранее в сообщении.

Как я в настоящее время решаю это? Служба-помощник на самом деле является поставщиком, и все методы отображаются как в разделе поставщика, так и в заводской функции. Не идеальный, но он работает. Я считаю это обходным, но я предпочел бы работать в приложении, а не в рамках, таким образом, впервые упомянутый метод.

Мысли?

ответ

0

Я не знал, но на самом деле вы можете ссылаться на фазу конфигурации. Проблема заключается в том, что MYSERVICE будет экземпляр дважды:/

angular 
    .module('X', []) 
    .config(function(myServiceProvider) { 
     myServiceProvider.$get().myFn(); 
    }) 
    .run(function(myService) { 
     myService.myFn(); 
    }) 
    .service('myService', ['$location', function($location) { 
     console.log('myService!'); 
     this.myFn = function() { 
     console.log($location.absUrl()); 
     } 
    }]); 

выход:

"myService!" 
    "location" 
    "myService!" 
    "location" 

Это опасно если вы звоните $ получить на конфиг сервис, который имеет большой вложенную зависимость Дерево:/

0

Я думаю, что правильный подход, если вам нужна служебная служба (без зависимости), заключается в использовании константы (таким образом вы можете ввести i t всюду). В противном случае, если вам нужны зависимости, используйте службу и придерживайтесь блока run().

Блок config() - это место, где вы можете проинструктировать свои службы о том, как они должны работать с помощью своих поставщиков.

Блок run() - это идеальное место для логики при запуске приложения (также известный как метод).