Как настроить службу в angularjs?

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

Мой вопрос в том, как вы этого добиваетесь?

С module.value() и внедрением зависимостей? Тогда как получить значение по умолчанию? Как сделать, чтобы значение вычислялось при инициализации, а не жестко закодировано?

С другим сервисом? Как сделать это универсальным?

У вас есть пример кода, потому что я немного запутался с этим.


person e-satis    schedule 17.07.2013    source источник
comment
Что вы подразумеваете под вычислением при инициализации, а не жестко закодированным? Вы можете обновлять значения, созданные с помощью module.value, а не module.constant, вы также можете использовать ng-init, вы потенциально можете асинхронно получать некоторые данные, а затем настраивать введенный module.value()   -  person shaunhusain    schedule 17.07.2013
comment
Допустим, я хочу получить значение конфигурации, сделать с ним асинхронный вызов, вернуть значение и затем внедрить его в свою службу.   -  person e-satis    schedule 17.07.2013
comment
Да, если я правильно понимаю, вы читаете какое-то значение конфигурации, которое ранее было установлено с помощью вызова module.value(key,value), получая значение, вызывая $injector.get(key), если вы не уверены, что инжектор был настроен с помощью этого ключа, который вы можете окружить блоком try catch и можете дать ему какое-то значение по умолчанию, в любом случае вы можете снова использовать module.value(), я полагаю, чтобы добавить или изменить любые значения для ввода. Возможно, вы обеспокоены тем, что angular вводил значения для сервисов и т. д. до их обновления, я полагаю, что $injector.get() получит для вас последнее значение.   -  person shaunhusain    schedule 17.07.2013
comment
Ах, ладно, я перечитал ваш вопрос здесь еще несколько раз, так что вы ищете что-то более похожее на файл свойств, который вы получили бы в Java, где вы настраиваете список вещей, которые находятся вне службы, но используются для ее настройки? Если это так, вы можете просто использовать отдельный файл JS, в котором вы устанавливаете все вызовы module.value, и вы можете использовать что-то вроде GruntJS для настройки конфигурации сборки, которая загружает соответствующий файл JS в зависимости от вашей цели сборки (или, возможно, даже повторно). напишите несколько файлов, хотя я не уверен, какие задачи для этого доступны)   -  person shaunhusain    schedule 17.07.2013
comment
Это не может быть так сложно. Я не хочу в это верить. Нет.   -  person e-satis    schedule 17.07.2013
comment
возможный дубликат Как мне создавать настраиваемые модули в AngularJS   -  person e-satis    schedule 20.08.2014
comment
Я голосую за закрытие своего вопроса, потому что нашел здесь ответ на SO: stackoverflow.com/questions/23600051/   -  person e-satis    schedule 20.08.2014
comment
Я бы действительно знал этот ответ, если бы увидел вопрос годом позже: P, рад, что вы нашли решение для определения пользовательского поставщика, поскольку это открывает возможность настроить службу. Для меня лично написание директив помогло сохранить вещи СУХИМИ и модульными... сервисы, которые я обычно все еще пишу для каждого приложения, хотя может быть некоторая польза от дальнейшего абстрагирования поверх $resource, сложность не показалась мне стоящей компромисса.   -  person shaunhusain    schedule 20.08.2014


Ответы (2)


Чтобы создать настраиваемую службу, вам нужно использовать provider, см.: http://docs.angularjs.org/guide/providers. Провайдеры позволяют настроить фабрику или службу в блоке конфигурации модуля перед его созданием. Простой пример см. на странице http://plnkr.co/edit/QMLBBQ3obE90FtCA2eBu.

Для более полного/сложного примера использования настраиваемых сервисов я бы посоветовал посмотреть проект Restangular, который также демонстрирует метод предоставления значений по умолчанию, которые могут быть переопределены разработчиком приложения.

person dspies    schedule 28.02.2014

Я считаю, что что-то подобное должно работать в вашей службе, если вы должны использовать .value() для объявления некоторых объектов для инъекции

var myLocalValue = myInjectedValue || "Some default value";

Я не очень разбираюсь в javascript, но этот ответ на SO, похоже, ускользает от того факта, что это тоже будет работать: Объяснение назначения переменных JavaScript ИЛИ (||)

Я сделал здесь скрипку, чтобы проверить ее, похоже, она работает так, как я ожидал:

http://jsfiddle.net/u3MY8/1/

JavaScript

var app = angular.module("myapp",[]);
// define a value
app.value('myThing', 'weee');

// use it in a service
app.factory('myService', ['myThing', function(myThing, myOtherThing){
    var myLocalOtherThing = myOtherThing || "some default";
   return {
       whatsMyThing: function() { 
          return myThing; //weee
       },
       whatsMyOtherThing: function() {
           return myOtherThing;
       },
       whatsMyOtherThingWithDefault: function() {
           return myLocalOtherThing;
       }
    }
}]);

// use it in a controller
app.controller('someController', function($scope, myService) {
    $scope.foo = myService.whatsMyThing(); //weee
    $scope.bar = myService.whatsMyOtherThing(); //""
    $scope.baz = myService.whatsMyOtherThingWithDefault(); //some default
});

HTML

<div ng-app="myapp" ng-controller="someController">
    <ol>
        <li>{{foo}}</li>
        <li>{{bar}}</li>
        <li>{{baz}}</li>
    </ol>
</div>

Обратите внимание, что это работает только в том случае, если myOtherThing не введен, если вы перечислите его для внедрения, но он не был определен, вы столкнетесь с ошибками, но я не уверен, каков именно вариант использования.

person shaunhusain    schedule 17.07.2013
comment
Как вы передаете myOtherThing, не вводя его? Вы настраиваете сервис вручную? Мне кажется, что это противоречит цели использования angularjs? - person e-satis; 17.07.2013
comment
Итак, я обновил скрипт пару раз, так как я вижу, что вы говорите, если вы не можете внедрить его без ошибки, не зная, что он был объявлен, тогда вы не можете сделать значение по умолчанию... вместо этого я использую Служба $injector для службы .get() и окружает ее блоком try catch, если она не объявлена. jsfiddle.net/u3MY8/3 - person shaunhusain; 17.07.2013
comment
Хорошо, я +1, потому что это будет работать (по крайней мере, синхронно), но я не могу представить, что это будет правильный способ сделать это. Должен быть другой путь... - person e-satis; 17.07.2013
comment
@ e-satis, очень вероятно, что я все еще многому учусь в Angular, поэтому может быть лучший способ, которым я просто стреляю от бедра, основываясь на том, что я знаю до сих пор. - person shaunhusain; 17.07.2013