2013-07-17 17 views
5

Mam usługi kątowe, które muszę konfigurować, w ten sposób mogę usunąć sprzężenie z mojej aplikacji i udostępnić część mojego kodu.W jaki sposób można konfigurować usługę w angularjs?

Moje pytanie brzmi: jak to osiągnąć?

With module.value() i wtrysk zależności? Jak uzyskać domyślną wartość? Jak zrobić wartość obliczoną na init, a nie na sztywno?

Z inną usługą? Jak zrobić to ogólne?

Masz kod na przykład, ponieważ jestem trochę zagubiony z tym.

+0

Co rozumiesz przez obliczenie na init, a nie na sztywno? Możesz aktualizować wartości utworzone za pomocą metody module.value, a nie module.constant, możesz również użyć ng-init, możesz pobrać asynchronicznie dane, a następnie skonfigurować injected module.value() – shaunhusain

+0

Powiedzmy, że chcę uzyskać wartość config, make asynchroniczne wywołanie z nim, odzyskaj wartość, a następnie wstrzyknij to do mojej usługi. –

+0

Yah, jeśli rozumiem poprawnie, odczytujesz wartość konfiguracyjną, która została wcześniej ustawiona za pomocą wywołania funkcji module.value (klucz, wartość), pobierając wartość przez wywołanie $ injector.get (klucz), jeśli nie masz pewności, że wtryskiwacz został skonfigurowany z tym kluczem, który można otoczyć blokiem catch próby i może dać mu pewne domyślne w obu przypadkach można użyć module.value() ponownie Wierzę, aby dodać lub zmienić dowolną wartość do wstrzyknięcia. Być może martwisz się o kątowe wprowadzenie wartości usług itp. Przed ich aktualizacją, wierzę, że $ injector.get() pobierze dla Ciebie najnowszą wartość. – shaunhusain

Odpowiedz

1

wierzę, coś jak to powinno działać w ramach swojej służby, jeśli były w użyciu .Value(), aby zadeklarować niektóre obiekty do wstrzykiwań

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

Nie jestem bardzo bystry javascript ale ta odpowiedź na SO wydaje wymykają się z faktem, że to będzie działać zbyt: JavaScript OR (||) variable assignment explanation

zrobiłem skrzypce tutaj, aby przetestować go wydaje się działać jak bym się spodziewał:

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> 

Zauważyć to działa tylko jeśli myOtherThing nie jest wstrzykiwany, jeśli listy to być wstrzykiwane ale to nie zostało zdefiniowane będzie prowadzony na błędy, ale nie jestem pewien, co to jest przypadek użycia.

+0

Jak przekazać myOtherThing bez wstrzykiwania? Konfigurujesz usługę ręcznie? Wydaje mi się, że pokonał cel używania angularjs? –

+0

Dobrze, więc zaktualizowałem skrzypce kilka razy, ponieważ widzę, co mówisz, jeśli nie możesz wstrzyknąć go bez błędu, nie wiedząc, że zostało zadeklarowane, wtedy nie możesz ustawić wartości domyślnej ... zamiast tego używam usługa $ injector do usługi .get() i otaczanie go blokiem catch try, na wypadek gdyby nie został zadeklarowany. http://jsfiddle.net/u3MY8/3/ – shaunhusain

+0

Ok, będę +1, ponieważ to zadziała (przynajmniej synchronicznie), ale nie mogę sobie wyobrazić, że byłby to właściwy sposób. Musi być inny sposób ... –

7

Aby utworzyć konfigurowalną usługę, należy użyć numeru provider, patrz: http://docs.angularjs.org/guide/providers. Dostawcy umożliwiają konfigurowanie fabryki lub usługi w bloku konfiguracyjnym modułu, zanim zostanie on utworzony. Na prostym przykładzie, patrz http://plnkr.co/edit/QMLBBQ3obE90FtCA2eBu

Dla pełniejszego/złożonej przykład tego, jak korzystać z usług konfigurowalne, chciałbym zaproponować spojrzenie na the Restangular project, który również demonstruje sposób dostarczania wartości domyślne, które mogą być nadpisane przez dewelopera aplikacji.