作为Angular的新手,我正在努力使用特殊的承诺设置来处理angular-translate。
我有一个正常工作的CustomLoader for angular-translate,工作正常。但我必须调用CustomLoader两次(使用$ translate.refresh())并根据外部条件,CustomLoader应加载固定的数据预设或相同的预设,但与外部后端调用的结果合并。 / p>
这是我到目前为止所得到的:
(function () {
'use strict';
/**
* TranslationCustomLoader
*/
angular
.module('myApp')
.factory('TranslationCustomLoader', TranslationCustomLoader);
function TranslationCustomLoader($q, ENV, $http, ExternalService) {
return function (options) {
var translations_en = {
MYKEY1: 'Value1',
MYKEY2: 'Value2',
MYKEY3: 'Value3'
};
var translations_de = {
MYKEY1: 'Wert1',
MYKEY2: 'Wert2',
MYKEY3: 'Wert3'
};
var deferred = $q.defer(), translations;
// Standard Dataset for Translations based on options.key (= language key)
if (options.key === 'en') {
translations = translations_en;
} else {
translations = translations_de;
}
// If some condition is met call external backend and retrieve additional data
if (ExternalService.isCondition()) {
$http({
method: 'GET',
params: {
lang: options.key
},
url: ENV.apiEndpoint + 'api/v1/translations'
}).success(function (data) {
// Now replace/add data in variable 'translations' by external result
// External result could be: [MYKEY2: 'AnotherValue', MYKEY4: 'AdditionalValue']
angular.forEach(data, function (value, key) {
translations[key] = value;
});
// Return 'merged' promise
deferred.resolve(translations);
return deferred.promise;
})
} else {
// Return 'standard' promise
deferred.resolve(translations);
return deferred.promise;
}
}}})();
调用CustomLoader,
如果外部条件为false,则返回标准承诺并通过$ translate成功解决。
如果外部条件为真,我可以看到外部后端被调用,我甚至看到了结果,但是我得到了一个'无法读取。然后未定义',因为看起来承诺不正确。
有人可以帮我解决这个问题吗?我已经尝试了很多(包括一些绝望的$ q.all,。等等)。
不幸的是,使用部分加载器(由angular-translate提供)不是替代方案。
答案 0 :(得分:2)
当isCondition()
为真时,您未从函数中返回任何内容。
您还使用了不推荐使用的success(),并且不允许链接承诺。
如果http呼叫失败,你永远不会拒绝你的承诺。这也是使用链接自动解决的。
代码应该看起来像
function (options) {
var translations_en = {
MYKEY1: 'Value1',
MYKEY2: 'Value2',
MYKEY3: 'Value3'
};
var translations_de = {
MYKEY1: 'Wert1',
MYKEY2: 'Wert2',
MYKEY3: 'Wert3'
};
var translations;
// Standard Dataset for Translations based on options.key (= language key)
if (options.key === 'en') {
translations = translations_en;
} else {
translations = translations_de;
}
// If some condition is met call external backend and retrieve additional data
if (ExternalService.isCondition()) {
return $http({
method: 'GET',
params: {
lang: options.key
},
url: ENV.apiEndpoint + 'api/v1/translations'
}).then(function (response) {
// Now replace/add data in variable 'translations' by external result
// External result could be: [MYKEY2: 'AnotherValue', MYKEY4: 'AdditionalValue']
angular.forEach(response.data, function (value, key) {
translations[key] = value;
});
// Return 'merged' promise
return translations;
});
} else {
return $q.when(translations);
}
}