web-dev-qa-db-fra.com

Constantes AngularJS

Est-il possible d'injecter une constante dans une autre constante avec AngularJS?

par exemple.

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

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

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

J'ai besoin de l’utilisation d’une constante angular parce que j’ai besoin de l’injecter dans une routine de configuration. I.e.

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

Je sais que vous pouvez uniquement injecter des constantes et des fournisseurs dans des routines de configuration, et je crois comprendre que vous pouvez effectuer une injection de dépendance dans des fournisseurs. Cependant, cela ne semble pas être la meilleure méthode pour ce type de scénario ...

Merci d'avance pour votre aide!

35
miklz

Vous avez raison, il est impossible d'enregistrer à la fois foo et bar en tant que constantes.

Également pour utiliser un fournisseur en guise de solution de contournement, vous avez presque réussi, sauf que vous devez stocker des données dans une instance de fournisseur:

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

puis dans le bloc de configuration, injectez l'instance de fournisseur d'une barre (pas une instance de barre car elle n'est pas encore disponible dans la phase de configuration):

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

J'espère que cela t'aides.

42
runTarm

Une autre approche consiste à utiliser expression de fonction appelée immédiatement pour définir une fonction et l'invoquer immédiatement. De cette façon, l'expression évalue et renvoie la valeur de la fonction, qui peut consister en deux constantes.

Ceci est réalisable en utilisant quelque chose de similaire à ceci:

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

puis utilisez les constantes comme:

console.log("foo: " + foo.foo);
console.log("bar: " + foo.bar);
4
S.Dav

Il semble que la meilleure façon de procéder consiste à faire de la deuxième constante un fournisseur. c'est à dire.

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

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

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

et alors:

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

Vous ne pouvez pas injecter une constante dans une autre constante. Angular ne le permet pas. Mais vous pouvez le faire en utilisant le service comme ci-dessous.

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

En outre, si votre valeur constante change dans le futur, il n’a pas de sens de faire usage de constant, car les constantes ne sont prêtes que (le javascript n’est cependant pas complètement supporté). Vous pouvez utiliser values au lieu de constant, une autre caractéristique de angularjs qui élimine l'utilisation de variables globales.

0
kalimsayyad

En ce qui concerne la documentation: / Guide du développeur/Fournisseurs

Il semble que la syntaxe des dépendances ne soit pas prise en charge. Il s'agit simplement d'une paire clé-valeur, où valeur pourrait être un objet.

0
GnrlBzik
    myApp.constant('bar', {
    get message() {
        Object.defineProperty(this, 'message', {
            value: angular.injector(['myApp']).get('foo').message,
            writable: false,
            enumerable: true,
            configurable: true
        });
        return this.message;
    }
})

essayez d'utiliser le chargement paresseux comme ceci, définissez la valeur sur first get

0
Sergey Sahakyan