Pregunta Constantes AngularJS


¿Es posible inyectar una constante en otra constante con AngularJS?

p.ej.

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

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

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

Necesito el uso de una constante angular porque necesito inyectar esto en una rutina de configuración. es decir

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

Sé que solo puede inyectar constantes y proveedores en las rutinas de configuración, y entiendo que puede hacer la inyección de dependencia en los proveedores, sin embargo, no parece ser el mejor método para este tipo de situaciones ...

¡Gracias de antemano por tu ayuda!


32
2017-07-18 18:12


origen


Respuestas:


Estás en lo correcto, es imposible registrar foo y bar como constantes.

Además, por utilizar un proveedor como solución temporal, casi lo hizo bien, excepto que tiene que almacenar datos en una instancia de proveedor:

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;
  };
}]);

y luego en el bloque de configuración, inyectar una instancia de proveedor de barra (no una instancia de barra ya que aún no está disponible en la fase de configuración):

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

Espero que esto ayude.


33
2017-07-18 19:08



Parece que la mejor manera de abordar esto es hacer que el segundo sea un proveedor constante. es decir

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

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

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

y entonces:

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

2
2017-07-18 18:33



Otro enfoque es usar Expresión de función invocada inmediatamente para definir una función e invocarla de inmediato. De esta forma, la expresión evalúa y devuelve el valor de la función, que puede constar de dos constantes.

Esto se puede lograr usando algo similar a esto:

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

y luego usa las constantes como:

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

2
2017-07-18 14:18



En cuanto a la documentación: / Guía del Desarrollador / Proveedores

Parece que no admite la sintaxis de dependencias, solo es un par de valores clave, donde el valor podría ser un objeto.


0
2017-07-18 18:33



No puedes inyectar una constante en otra constante. Angular no permite eso. Pero puede lograrlo utilizando el servicio como se indica a continuación

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;

});

También para agregar, si su valor constante está cambiando en el futuro, no tiene sentido usar constante porque las constantes están listas solamente (Sin embargo, javascript no lo admite por completo). Puedes usar valores en lugar de constante, que es otra característica en angularjs que elimina el uso de variables globales.


0
2018-03-07 21:35




Aquí está la manera simple de crear y usar la constante.

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

// permite defint constante

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

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

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

})

Abra el navegador en cromo y vea el resultado en la consola del navegador.
Agradeciendote.


-3
2017-10-23 10:11