2014-04-09 11 views
9

Ho scritto un modulo in angularJS che incapsula tutte le comunicazioni di backend. Per maggiore flessibilità ho il prefisso api come valore costante sul modulo (potrebbe essere valore dato che non lo sto usando nella fase di configurazione). così qualcosa comeIl modo migliore per sovrascrivere valori/costanti del modulo in angularJS

angular.module('myapp.data').constant('apiPrefix', '/api/data'); 

Ora voglio usare questo modulo da due applicazioni diverse. Uno usa/api1/data e l'altro/api2/data e vorrei cambiarlo durante la fase di configurazione dell'applicazione. So come farlo con un provider, ma avere un provider in possesso di un valore mi sembra eccessivo. Posso modificare costanti o valori dei moduli usati dalla fase di configurazione dell'applicazione?

qualcosa di simile:

angular.module("data", []) 
.value('apiPrefix', '/api/data') 
.factory('display', function(apiPrefix){ 
    return { 
    pref: function(){ 
     console.log(apiPrefix); 
     return apiPrefix; 
    } 
    } 
}); 


angular.module("myApp",['data']) 
.config(['apiPrefix', function(prefix){ 
    prefix = 'https:/api/data'; 
}]) 
.controller("Example", function($scope, display) { 
    $scope.prefix = display.pref; 
}); 
+1

Non sono sicuro, ma puoi provare a farlo nella fase 'run'. – Chandermani

+0

Sì, puoi aggiornare un valore in fase di esecuzione e puoi inserire una costante in config ma poiché è una costante non può essere modificata http://stackoverflow.com/questions/13035568/angular-js-value-not -injected-in-config – shaunhusain

+0

Quindi quello che stai dicendo è che dovrebbe essere un valore invece di una costante nel modulo e modificarlo in fase di esecuzione dell'applicazione invece della configurazione? – masimplo

risposta

10

per sovrascrivere i valori del modulo, è possibile ridefinire il valore angolare nei moduli successivi. Credo che non dovrebbe essere fatto il tempo di configurazione del modulo.

angular.module("data", []) 
.value('apiPrefix', '/api/data') 
.factory('Display', function(apiPrefix){ 
    return { 
    pref: function(){ 
     return apiPrefix; 
    } 
    } 
}); 




angular.module('myapp', ['data']) 
    .value('apiPrefix', '/api2/data') 
    .controller('MainCtrl', function($scope, Display) { 
     $scope.name = Display.pref(); 
    }); 

vedere il plunker qui: http://plnkr.co/edit/k806WE

stessa cosa è applicabile per le costanti angolari troppo.

+2

Ottima soluzione. Mi piace riempire male che non sapevo, dal momento che avrei potuto sovrascrivere accidentalmente una costante o un valore del modulo, dal momento che li sto usando molto. Per fortuna, cerco sempre di creare nomi descrittivi unici. – masimplo

+0

Grazie @ mxa055. In realtà, preferisco mantenere costanti e valori come gli endpoint di configurazione o backend api in un modulo di configurazione separato. – khanmizan

1

moduli angolari, controller, ecc può essere contenuta all'interno di funzioni, se-dichiarazioni, ecc Essi non devono essere al livello superiore. Quindi, potresti includere questo nel tuo codice:

if (environmentOne()) { 
    module.value('apiPrefix','api1/data'); 
} else { 
    module.value('apiPrefix','api2/data'); 
} 

Sperare che aiuti!

+0

Sembra interessante, ma mi dispiacerebbe dover fare qualcosa del genere nel mio modulo per ogni diversa applicazione che potrebbe usarmi.Non crea una "dipendenza" tra il modulo e i suoi utenti. – masimplo

+0

Ah, hai ragione. Ho letto male la tua domanda e ho pensato che fosse una questione di sviluppo/scenografia/ambienti di produzione. La risposta di Khanmizan è migliore. –

6

nostro modulo

angular.module("data", []) 
    .constant('apiPrefix', '/api/data'); 

possiamo ignorare constant completamente, come value.

angular.module('myapp', ['data']) 
    .constant('apiPrefix', '/api2/data'); 

anche noi possiamo ignorare completamente in config

angular.module('myapp', ['data']) 
    .config(function ($provide) { 
     $provide.constant('apiPrefix', '/api2/data'); 
    }); 

anche noi possiamo ignorare completamente o parzialmente (se oggetto) in run

angular.module('myapp', ['data']) 
    .run(function (apiPrefix) { 
     apiPrefix = '/api2/data'; 
    }); 

Ma se vogliamo ignorare constant con oggetto parzialmente in config (non in esecuzione), possiamo fare qualcosa come questo

angular.module("module1", []) 
    .constant('myConfig', { 
     param1: 'value1' , 
     param2: 'value2' 
    }); 

angular.module('myapp', ['data']) 
    .config(function ($provide, myConfig) { 
     $provide.constant(
      'myConfig', 
      angular.extend(myConfig, {param2: 'value2_1'}); 
     ); 
    }); 
+1

Riferimento myConfig con stringa per sovrascrivere i valori estesi sul modulo myapp. angular.module ('myapp', [ 'dati']) .config (function ($ fornire, myconfig) {$ provide.constant ( myconfig, angular.extend ('myconfig', {param2: 'value2_1 '}); ); }); – Zawarudo

+1

Grazie. Sì, '$ provide.constant ('myConfig', ...' - 'myConfig' deve essere una stringa! –

Problemi correlati