Подтвердить что ты не робот

Угловые константы

Можно ли вставить константу в другую константу с помощью AngularJS?

например.

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

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

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

Мне нужно использовать константу angular, потому что мне нужно ввести ее в подпрограмму config. то есть.

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

Я знаю, что вы можете вводить константы и провайдеры только в подпрограммы config, и я понимаю, что вы можете делать инъекции зависимостей в провайдерах, однако это не лучший метод для такого рода сценариев...

Заранее благодарим за помощь!

4b9b3361

Ответ 1

Вы правы, невозможно зарегистрировать как foo, так и bar как константы.

Также для использования провайдера в качестве обходного пути вы почти поняли это, за исключением того, что вам нужно хранить данные в экземпляре поставщика:

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

а затем в блоке конфигурации вставьте экземпляр поставщика бара (а не экземпляр бара, поскольку он еще не доступен в фазе конфигурации):

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

Надеюсь, что это поможет.

Ответ 2

Кажется, лучший способ приблизиться к этому - сделать вторую константу провайдером. то есть.

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

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

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

а затем:

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

Ответ 3

Другим подходом является использование Немедленно вызываемое выражение функции, чтобы определить функцию и вызвать ее немедленно. Таким образом, выражение оценивает и возвращает значение функции, которое может состоять из двух констант.

Это достигается с помощью чего-то похожего на это:

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

а затем используйте константы типа:

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

Ответ 4

Что касается документации: /Руководство разработчика/Провайдеры

Похоже, что он не поддерживает синтаксис зависимостей, это просто пара ключевых значений, где значение может быть объектом.

Ответ 5

Вы не можете вводить одну константу в другую константу. Угловое не позволяет этого. Но вы можете выполнить это, используя сервис, как показано ниже.

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

Также к аддону, если ваше постоянное значение меняется в будущем, не имеет смысла использовать константу, потому что константы готовы только (однако javascript не поддерживает ее полностью). Вы можете использовать значения вместо константы, что является еще одной функцией в angularjs, которая исключает использование глобальных переменных.

Ответ 6

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

попробуйте использовать отложенную загрузку, как это, установленное значение на первом get

Ответ 7


Вот простой способ для создания и использования константы.

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

})
Откройте браузер в chrome и посмотрите результат в консоли браузера.
Благодарим вас.