2014-07-18 15 views
30

E 'possibile iniettare una costante in un'altra costante con AngularJS?Costanti angolariJS

ad es.

var app = angular.module('myApp'); 

app.constant('foo', { message: "Hello" }); 

app.constant('bar', ['foo', function(foo) { 
    return { 
     message: foo.message + ' World!' 
    } 
}]); 

Ho bisogno dell'uso di una costante angolare perché ho bisogno di iniettare questo in una routine di configurazione. cioè

app.config(['bar', function(bar) { 
    console.log(bar.message); 
}]); 

so che si può iniettare solo le costanti e fornitori in routine di configurazione, e la mia comprensione è che si può fare l'iniezione di dipendenza in fornitori, tuttavia, non sembra essere il metodo migliore per questo tipo di scenario ...

Grazie in anticipo per il vostro aiuto!

+0

Quindi è possibile aggirare il problema, in base alla propria risposta:) La domanda è: perché lo faresti? Dov'è il valore del mondo reale, perché non definire un servizio basato su più costanti? – GnrlBzik

+0

Il motivo per cui sto facendo questo è definire i livelli di autorizzazione ... Ho delle costanti che definiscono i livelli di ruolo degli utenti e i livelli di accesso degli utenti (i livelli di accesso dipendono dai ruoli) e questo viene quindi iniettato nella routine di configurazione. – miklz

risposta

30

Si è corretto, è impossibile registrare sia foo che bar come costanti.

anche per l'utilizzo di un provider come soluzione alternativa, è quasi capito bene, tranne che si deve memorizzare i dati in un'istanza fornitore:

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

app.constant('foo', { 
    message: 'Hello' 
}); 

app.provider('bar', ['foo', function(foo) { 
    this.data = { 
    message: foo.message + ' World!' 
    }; 

    this.$get = function() { 
    return this.data; 
    }; 
}]); 

e poi nel blocco di configurazione, iniettare l'istanza fornitore di un bar (non un'istanza bar in quanto non è ancora disponibile in fase di configurazione):

app.config(['barProvider', function(barProvider) { 
    console.log(barProvider.data.message); 
}]); 

Spero che questo aiuti.

2

Sembra che il modo migliore per avvicinarsi a questo è rendere la seconda costante un fornitore. cioè

var app = angular.module('myApp'); 

app.constant('foo', { message: "Hello" }); 

app.provider('bar', ['foo', function(foo) { 
    this.$get = function() { 
     return { 
      message: foo.message + ' World!' 
     }; 
    } 
}]); 

e poi:

app.config(['bar', function(bar) { 
    console.log(bar.message); 
}]); 
+2

La barra è un'istanza di servizio che non può essere iniettata nella fase di configurazione. – runTarm

+0

Grazie per il vostro chiarimento! Questo è stato molto utile! – miklz

0

Per quanto riguarda la documentazione va: / Developer Guide/Providers

sembra che non supporta la sintassi delle dipendenze, si tratta solo di coppia chiave-valore, dove il valore potrebbe essere un oggetto.

-3


Ecco il modo semplice per creare e utilizzare la costante.

var app=angular.module("#app_name#",[]);

//lets defint constant

app.constant("constantService",{attr:"this is first contant"});

app.controller("#controller_name#",function($scope,constantService){

console.log(constantService);
console.log(constantService.attr);

})
Aprire il browser in chrome e vedere il risultato nella console del browser.
Grazie.

2

Un altro approccio consiste nell'utilizzare Immediately-invoked function expression per definire una funzione e richiamarla immediatamente. In questo modo, l'espressione valuta e restituisce il valore della funzione, che può essere costituito da due costanti.

Ciò è realizzabile utilizzando qualcosa di simile a questo:

app.constant("foo", (function() { 
    var message = 'Hello' 
    return { 
     foo: message, 
     bar: message + " World!" 
    } 
})()); 

e quindi utilizzare le costanti come:

console.log("foo: " + foo.foo); 
console.log("bar: " + foo.bar); 
0

Non si può iniettare una costante in un'altra costante. Angolare non lo consente.Ma si può realizzare utilizzando il servizio come di seguito

angular.module('myApp', []) 
.constant('firstName','John') 
.constant('lastName','Smith) 
.service('name',function(firstName,lastName) 
{ 
    this.fullName = firstName+' '+lastName; 
}) 
.controller('mainCtrl',function($scope,name) { 

    $scope.name = name.fullName; 

}); 

anche al componente, se il valore costante sta cambiando nel futuro, non ha senso fare uso di costante perché le costanti sono solo pronti (Tuttavia javascript fa non supportarlo completamente). È possibile utilizzare i valori anziché anziché la costante, che è un'altra caratteristica di angularjs che elimina l'uso di variabili globali.