Угловые константы
Можно ли вставить константу в другую константу с помощью 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, и я понимаю, что вы можете делать инъекции зависимостей в провайдерах, однако это не лучший метод для такого рода сценариев...
Заранее благодарим за помощь!
Ответы
Ответ 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 и посмотрите результат в консоли браузера.
Благодарим вас.