我试图通过循环一个对象数组然后添加一个新的"消息来构建翻译的消息。包含已翻译字符串的该对象的属性。我在$ translate.then()中看到正确的消息输出;但是当我将消息分配给对象时,它是未定义的。解决$ translate.then()返回的承诺的正确方法是什么,并将其分配给"消息"属性?
// items.controller.js
function getItems() {
return itemsFactory.getItems()
.then(function (response) {
vm.items = initItemsList(response.activities);
});
}
function initItemsList(itemsList) {
for (var i = 0; i < itemsList.length; i++){
var activityType = itemsList[i].activityType;
switch (activityType){
case "HISTORY": {
var itemName = itemsList[i].item.itemName;
var itemVersion = itemsList[i].item.itemVersion;
$translate('activity.'+activityType, { itemname: itemName, itemversion: itemVersion }).then(function(content){
vm.itemContent = content;
console.log(vm.itemContent); // correct message displayed.
});
break;
}
default: {
break;
}
}
itemsList[i].message = vm.itemContent; // undefined
}
return itemsList;
}
// translation.json
"activity : {
"HISTORY" : "History for {{ itemname }} {{ itemversion }}."
}
答案 0 :(得分:0)
正如@Vegar正确指出的那样,then
中的代码在赋值后执行,因此移动then
函数内的赋值将解决问题。但是,在完成所有翻译之前,您的itemsList
将从函数返回,因此您需要返回一个在所有翻译完成时解析的承诺:
function initItemsList(itemsList) {
var allTranslations = [];
for (var i = 0; i < itemsList.length; i++){
var activityType = itemsList[i].activityType;
switch (activityType){
case "HISTORY": {
var itemName = itemsList[i].item.itemName;
var itemVersion = itemsList[i].item.itemVersion;
allTranslations.push($translate('activity.'+activityType, { itemname: itemName, itemversion: itemVersion }).then(function(content){
vm.itemContent = content;
itemsList[i].message = vm.itemContent;
}));
break;
}
default: {
break;
}
}
}
return $q.all(allTranslations);
}
你的函数的调用者必须这样做:
initItemList(itemList).then(function(translatedList){
//Do stuff with translated list
});
答案 1 :(得分:0)
Promise总是以异步方式解析。声明
itemsList[i].message = vm.itemContent;
,在切换之后立即执行,在回调传递给$ translate promise之前执行。只需将语句移至回调:
$translate('activity.'+activityType, { itemname: itemName, itemversion: itemVersion }).then(function(content){
vm.itemContent = content;
console.log(vm.itemContent);
itemsList[i].message = vm.itemContent;
});