angularjs - как ссылаться на значение, определенное в том же модуле
Я пишу модуль конфигурации, который включает два рецепта.value:
- BaseUrl
- количество URL REST API, которые идут в верхней части baseURL
В настоящее время я настроил их как.value, но они могут быть так же легко.constant
Поскольку я хочу иметь возможность изменять baseURL без необходимости переписывать все URL-адреса API, мне нужно сослаться на только что определенный baseURL - в том же модуле:
var configuration = angular.module('configuration', []);
configuration.value('Config',{
baseURL : 'http://dev.mysite.com/', // define Base URL
});
configuration.value('ApiList', {
getMyDataLink1 : this.baseURL + 'rest/folder1/action1/api_key/',
getMyDataLink2 : this.baseURL + 'rest/folder2/action2/api_key/',
getMyDataLink3 : this.baseURL + 'rest/folder3/action3/api_key/',
});
когда я проверяю переменные:
Config.baseURL
правильно выводит какhttp://dev.mysite.com/
ApiList.getMyDataLink1
определяется только наполовину, так какthis.baseURL
часть не определена (т.е. она выводитundefinedrest/folder1/action1/api_key/
)
Я также попытался определить значение.value ApiList как:
getMyDataLink1 : Config.baseURL + 'rest/folder1/action1/api_key/',
//or
getMyDataLink1 : baseURL + 'rest/folder1/action1/api_key/',
но любой из них выдает ошибку "Uncaught ReferenceError: XXXX не определено"...
Можно ли ссылаться на.value из другого.value в том же модуле?
РЕДАКТИРОВАТЬ: см. http://jsfiddle.net/goredwards/yy5xuodh/
РЕДАКТИРОВАТЬ 2: см. http://jsfiddle.net/goredwards/xvj5xcgz/ где я преобразовал 2-е.value в.factory - затем сравните с методом js-only в нижней части скрипки - должен быть более краткий Кстати, чем это?
3 ответа
Как указывал Гаурав, кажется, что невозможно вставить что-либо в рецепт.value, поэтому самый короткий и ясный способ (с точки зрения удобства обслуживания), который я нашел, - это преобразовать конкатенационный рецепт.value (т.е. 2-й) в.factory рецепт и введите переменную 'Config' .value:
var configuration = angular.module('configuration', []);
configuration.value('Config',{
baseURL : 'http://dev.mysite.com/', // define Base URL
});
configuration.factory('ApiList', ['Config', function(Config){
return{
getMyDataLink1 : Config.baseURL + 'rest/folder1/action1/api_key/',
getMyDataLink2 : Config.baseURL + 'rest/folder2/action2/api_key/',
getMyDataLink3 : Config.baseURL + 'rest/folder3/action3/api_key/'
};
}]);
хотя это работает (см. http://jsfiddle.net/goredwards/xvj5xcgz/) и является относительно лаконичным и ясным, кажется странным, что.values нельзя просто объединить с другими.values ...
Насколько я знаю, вы не можете ввести зависимость значения в другое значение. Вы можете использовать сервис или фабрику для создания ваших URL-адресов API. Что-то вроде этого:
configuration.value('Config',{
baseURL : 'http://dev.mysite.com/', // define Base URL
});
configuration.value('ApiList', {
getMyDataLink1 : 'rest/folder1/action1/api_key/',
getMyDataLink2 : 'rest/folder2/action2/api_key/',
getMyDataLink3 : 'rest/folder3/action3/api_key/',
});
app.service('URLService', ['Config', 'ApiList', function(Config, ApiList){
return {
getURLs : function() {
var url = Config.baseURL+ApiList.getMyDataLink1;
return url;
}
}}]);
Вы пытались внедрить Config в ApiList?
configuration.value('ApiList', function(Config) {
getMyDataLink1 : Config.baseURL + 'rest/folder1/action1/api_key/',
getMyDataLink2 : Config.baseURL + 'rest/folder2/action2/api_key/',
getMyDataLink3 : Config.baseURL + 'rest/folder3/action3/api_key/',
});