2013-06-29 16 views
65

Sto cercando di costruire un modulo myApp.config per memorizzare alcune impostazioni per la mia app, ho scritto un file config.js:
AngularJS - Come costanti modulo da un controller

angular.module('myApp.config', []) 
    .constant('APP_NAME','My Angular App!') 
    .constant('APP_VERSION','0.3'); 

ho aggiunto a i miei app.js (angolare-semi):

angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives', 'myApp.controllers', 'myApp.config']). 

ho aggiunto al file index.html, e ora sto cercando di capire come ottenere nei miei controllori, ho provato:

angular.module('myApp.controllers', ['myApp.config']) 
    .controller('ListCtrl', ['$scope', 'myApp.config', function($scope, $config) { 
    $scope.printme = $config; 
    }]) 

ma sto ottenendo:

Unknown fornitore: myApp.configProvider < - myApp.config

Probabilmente sto facendo qualcosa di sbagliato qui, tutte le idee?

+0

Asaf si è tentato di iniettare un modulo come dipendenza in un controller, che non funzionerà. Un modulo può essere una dipendenza solo da un altro modulo. – Shivam

risposta

84

Non credo sia valido utilizzare il nome del modulo in un'iniezione del genere. Si può semplicemente iniettare le costanti per nome, però:

angular.module('myApp.controllers', ['myApp.config']) 
    .controller('ListCtrl', ['$scope', 'APP_NAME', function($scope, appName) { 
    $scope.printme = appName; 
}]); 
+4

Corretto, c'è uno spazio di iniezione di dipendenza globale, una volta impostato un '. Conststant' in qualsiasi modulo è possibile iniettare il valore da qualsiasi altra parte. – jpsimons

+6

In genere è un modo ragionevole per avere un file di configurazione (per le impostazioni personalizzabili) in Angolare? – Asaf

+0

@Asaf si può andare con il seguente servizio. Costante. 'angular.module ('app'). constant ('appSettings', {version: '1.0', appName: 'myApp'});' Quindi iniettalo su un controller o .config o qualsiasi altra cosa desideri 'angular. module ('app'). controller ('simpleCtrl', ['appSettings', function (appSettings) {$ scope.valueInIsolatedScope = appSettings.version;}]) ' – hastrb

71

penso che l'approccio più semplice è quello di aggiungere una costante utilizzando un oggetto letterale. Questo si adatta alla maggior parte dei casi di utilizzo della configurazione dell'applicazione, perché supporta un oggetto di configurazione complesso. Anche il passaggio constant viene eseguito in anticipo, sono registrati before other providers.

angular.module('myApp').constant('cfg', { 
    url: 'https://myapi.com/v1/', 
    httpTimeout: 5000 
}) 

Per utilizzarlo è sufficiente iniettare cfg:

angular.module('myApp').factory('user', function(cfg, $http){ 
    // cfg and $http together at last 
}) 
+0

Esattamente quello che stavo cercando! – Devner

+0

Ho un provider costante con i codici chiave utilizzati per la navigazione e vorrei iniettare il provider costante al controller (voglio evitare di iniettare ogni voce separatamente). È possibile? Ho alcuni altri servizi già iniettati. – owczarek

+0

È più difficile di: 'angular.module ('myApp'). Constant ('keyCodes', {left: 36, right: 38}) '' e: 'angular.module (' myApp '). Factory (' myComponent ', function (keyCodes) {keyCodes.left}) '? – SimplGy

3

Va inoltre notato che la soluzione di SimplGy significa che l'oggetto 'CFG' è una costante, tuttavia le proprietà di tale oggetto non lo sono. Ciò significa, che non si può riassegnare 'CFG' in questo modo:

cfg = { randomProperty: randomValue }; 

È possibile riassegnare le proprietà dell'oggetto 'CFG' in questo modo:

cfg.url = 'BrandNewURL.com'; 
cfg.httpTimeout = 30; 
+0

Questo non risponde alla domanda. Le risposte ad altre risposte dovrebbero essere scritte come commenti. –

+0

@KenWayneVanderLinde Scuse Ken. Sfortunatamente, non ho ancora ricevuto un rappresentante sufficiente per commentare, ma ho pensato che fosse importante che l'autore fosse a conoscenza dei problemi che possono verificarsi usando la costante di Angulars. –

+0

@MattM Penso che tu stia bene. Inserire tutto questo in un commento sarebbe stato impossibile. – carmenism

1

controllo l'uso di costanti in questo esempio:

angular 
.module('abp001App', ['ngRoute']) 
.constant("myConfig", { 
    "url": "http://localhost", 
    "port": "80" 
}) 
.config(function ($routeProvider) { 
    $routeProvider 
     .when('/', { 
      templateUrl: 'views/main.html', 
      controller: 'MainCtrl' 
     }) 
     .otherwise({ 
      redirectTo: '/' 
     }); 
}) 
.controller('MainCtrl', function (myConfig) { 
    // Do something with myConfig... 
}); 

Vedi l'articolo completo sul angularJs costanti buone pratiche here

+0

roger che @ryanyuyu ringrazia –

Problemi correlati