2013-08-28 9 views
73

Próbuję zdefiniować stałe z innymi stałymi, ale wydaje się, że nie można tego zrobić, ponieważ początkowa stała nie jest gotowa, gdy wymagana stała stała wymaga tego. Chcę się upewnić, czy to w ogóle nie jest możliwe.Czy istnieje sposób w Angularjs do definiowania stałych z innymi stałymi?

Obecnie mam stałe w ten sposób:

angular.module('mainApp.config', []) 
    .constant('RESOURCE_USERS_DOMAIN', 'http://127.0.0.1:8008') 
    .constant('RESOURCE_USERS_API', 'http://127.0.0.1:8008/users') 
    // Specific routes for API 
    .constant('API_BASIC_INFORMATION', RESOURCE_USERS_API + '/api/info') 
    .constant('API_SOCIAL_NETWORKS', RESOURCE_USERS_API + '/api/social') 
    ; 

Drugie dwie stałe jest to, co chcę osiągnąć

Odpowiedz

44

kątowe sposobem definiowania zależności między kontrolerami, usług i innych jest przez wstrzykiwania zależności (DI). Więc jeśli masz kontroler A, który zależy od usługi B, musiałbyś ją utworzyć w ten sposób.

var myApp = angular.module("exampleApp",[]); 

myApp.controller("aCtrl", function(serviceB){ 
    //Controller functionally here 
}); 

Zobacz, kątowe sprawdzi zależność serviceB i poszukaj usługi utworzonej z tą nazwą. Jeśli nie stworzysz, dostaniesz błąd.

Tak więc, jeśli chcesz utworzyć stałą A, która zależy od stałej B, musisz powiedzieć kątowo, że A zależy od B. Ale stała nie może mieć zależności. Stała może zwrócić funkcję, ale DI nie będzie działać dla stałej. Sprawdź to Fiddle, aby zobaczyć, które metody DI działają: http://jsfiddle.net/RMj5s/1/

Odpowiadając na twoje pytanie, nie możesz zdefiniować stałej z innymi stałymi.

Ale można to zrobić:

angular.module('projectApp', []) 
    .constant('domain','http://somedomain.com') 
    .constant('api','/some/api/info') 
    .service('urls',function(domain,api){ this.apiUrl = domain+api;}) 

    .controller('mainCtrl',function($scope,urls) { 

     $scope.url = urls.apiUrl; 

    }); 

Sprawdź to skrzypce zobaczyć to działa: http://jsfiddle.net/kJ3tT/1/

Jeśli chcesz zrozumieć więcej o DI, sprawdź ten wpis: http://merrickchristensen.com/articles/javascript-dependency-injection.html

Mam nadzieję, że to może odpowiedzieć na twoje pytanie.

3

nie mogę powiedzieć na pewno, czy to (im) możliwe. Ale rozwiązaniem byłoby zdefiniowanie stałych bazowych jako regularnych stałych, a wyższego rzędu jako usług z zamknięciami, aby upewnić się, że nie można ich zmienić.

Szorstki przykład:

angular.module('myApp').constant('BASE_CONSTS',{ 
    'FIRST_CONST': '10', 
    'SECOND_CONST': '20' 
}); 

angular.module('myServices').factory('MyServiceName', ['BASE_CONSTS', function ('BASE_CONSTS') { 
    var SECOND_ORDER_CONST = BASE_CONSTS.FIRST_CONST * 100; 
    return { 
     GET_SECOND_ORDER_CONST: function() { 
      return SECOND_ORDER_CONST; 
     } 
    } 
}]); 

i używać go po wstrzyknięciu usługę:

MyServiceName.GET_SECOND_ORDER_CONST(); 

Nie bardzo elegancki, ale należy to zadanie.

12

to zrobić w ten sposób:

var constants = angular.module('constants', []); 

constants.factory("Independent", [function() { 
    return { 
     C1: 42 
    } 
}]); 

constants.factory('Constants', ["Independent", function(I) { 
    return { 
     ANSWER_TO_LIFE: I.C1 
    } 
}]); 
+0

@Beterraba. Czy mógłbyś to rozwinąć? Gdzie będzie ten kod? Dzięki. Mark – mark1234

+0

@ mark1234 Ten kod może iść tam, gdzie chcesz. Chciałbym umieścić to w moim pliku usług. Musisz pamiętać o dodaniu modułu "constants" do swojego głównego modułu. – Beterraba

143

Łatwym sposobem na to jest tak:

var myApp = angular.module("exampleApp",[]); 

myApp.constant('RESOURCES', (function() { 
    // Define your variable 
    var resource = 'http://127.0.0.1:8008'; 
    // Use the variable in your constants 
    return { 
    USERS_DOMAIN: resource, 
    USERS_API: resource + '/users', 
    BASIC_INFO: resource + '/api/info' 
    } 
})()); 

i używać stałych tak:

myApp.controller("ExampleCtrl", function(RESOURCES){ 
    $scope.domain = RESOURCES.USERS_DOMAIN; 
}); 

punktów: link

+3

@Helzgate To nie jest to, co mówił @ gabn88. Funkcja przekazywana do 'myApp.constant' jest natychmiastowym wywołanym wyrażeniem funkcji lub IIFE. To się nazywa, więc nie musisz! Wygląda to tak: '(function (params) {// do stuff})()'. Zwróć uwagę na nawiasy wokół wyrażenia funkcji i dodatkowego zestawu na końcu. – daemonaka

+0

@Helzgate Stała o nazwie 'RESOURCES' nie będzie wyrażeniem funkcji, dlatego też * obiektem zwróconym przez * tę funkcję. – daemonaka

+2

Najlepsza dostępna odpowiedź. –

8

Dopóki nie trzeba dostęp do stałej w dostawcach, to powinno działać poprawnie:

.constant('HOST', 'localhost') 
.factory('URL', function(HOST) { return "http://" + HOST }) 

Jeśli potrzebujesz dostępu do ciebie w stałych dostawców, to chyba trzeba zrobić trochę więcej pracy:

.constants('HOST', 'localhost') 
.provider('DOMAIN', function(HOST) { 
    var domain = "http://" + HOST; 
    this.value = function() { return domain }; 
    this.$get = this.value; 
}) 
.provider("anyOtherProvider", function(DOMAINPovider) { 
    var domain = DOMAINProvider.value(); 
}; 
.factory("anyOtherService", function(DOMAIN) { 
}) 
+0

Ta odpowiedź powinna uzyskać więcej miłości :). Dzięki;) –

2

Rozwiązanie dostarczone przez @Linkmichiel jest dobra, ale jeśli człowiek chce używać jednej stałej wewnątrz drugiego, można je połączyć w bloku konfiguracyjnym:

angular.module("exampleApp", []) 
 

 
.constant('BASE_URL', 'http://127.0.0.1:8008') 
 

 
.constant('RESOURCES', { 
 
    USERS_DOMAIN: '', 
 
    USERS_API: '/users', 
 
    BASIC_INFO: '/api/info' 
 
}) 
 

 
.config(function(BASE_URL, RESOURCES) { 
 
    for (prop in RESOURCES) { 
 
    RESOURCES[prop] = BASE_URL + RESOURCES[prop]; 
 
    } 
 
}) 
 

 
.controller('WhatIsInResourcesController', function($scope, RESOURCES) { 
 
    $scope.RESOURCES = RESOURCES; 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="exampleApp"> 
 
    <div ng-controller="WhatIsInResourcesController"> 
 
    <pre>{{ RESOURCES | json }}</pre> 
 
    </div> 
 
</div>

Po fazie config, wszystkie stałe będzie konfiguracja corr ectly (wypróbuj ten fragment).

Morał z tej historii brzmi: Angular jest tak fajny, że można nawet zmienić stałe.

+1

Jako uzupełnienie. Musisz zdeklarować 'dla (prop w RESOURCES) {' using var or let, like 'for (let prop in RESOURCES) {'. – josivan

1

is there a way in Angularjs to define constants with other constants?

Lokal Nienawidzę sklepu pojedynczej stałej w każdym .constant deklaracji, zazwyczaj używam następującą składnię do przechowywania wszystkich stałych do jednego zgłoszenia:

.constant("SampleConst", { 
    Types: { 
     "A": "toggle",  
     "B": "run", 
     "C": "close", 
    }, 
    "MenuItems": [ 
     { 
      code: 100, 
      type: "toggle"  //Here I'd like use Types defined before 
     }, 
     { 
      code: 200, 
      type: "toggle"  //Here I'd like use Types defined before 
     }, 
    }], 
    "Nationalities": ["I", "E", "S"], 
    "OtherCost": "TEST", 
}) 

To jest moje rozwiązanie do przechowywania stałych i używaj tej samej stałej wewnątrz innych

.constant("SampleConst", function() { 

    var _types = { 
      TOGGLE: "toggle",  
      RUN: "run", 
      CLOSE: "close", 
    }; 



    var constants = { 
     Types: _types , 
     MenuItems: [ 
      { 
       code: 100, 
       type: _types.TOGGLE  //NOW USING CONSTANT 
      }, 
      { 
       code: "200", 
       type: _types.RUN   //NOW USING CONSTANT 
      } 
     ], 
     Nationalities: ["I", "E", "S"], 
     OtherCost: "TEST" 
    }; 
    return constants; 

    }()   // <----- Be careful to place double() at the end 
) 
Powiązane problemy