内部循环中的角度转换

时间:2015-04-14 21:21:06

标签: angularjs promise angular-translate

我试图通过循环一个对象数组然后添加一个新的"消息来构建翻译的消息。包含已翻译字符串的该对象的属性。我在$ 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 }}."
    } 

2 个答案:

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