Javascript 如何在对象文本中使用承诺

Javascript 如何在对象文本中使用承诺,javascript,angularjs,angular-translate,Javascript,Angularjs,Angular Translate,在版本2.0中,不再返回实际的翻译,而是一个承诺。我可以看出这是一个好主意,因为可能会发生一些异步加载。但在我的例子中,如何正确使用该服务让我感到困惑,因为我在对象文本中使用了$translate服务,如下所示 $scope.myDefs = [ ... { field: 'supplier', displayName: $translate('Supplier'), cellTemplate: "&

在版本2.0中,不再返回实际的翻译,而是一个承诺。我可以看出这是一个好主意,因为可能会发生一些异步加载。但在我的例子中,如何正确使用该服务让我感到困惑,因为我在对象文本中使用了$translate服务,如下所示

$scope.myDefs = [
      ...
      {
            field: 'supplier',
            displayName: $translate('Supplier'),
            cellTemplate: "<div class=\"ngCellText\">...</div>"
      },
      ...
      {
            field: 'supplierSize',
            displayName: $translate('Size'),
            width: 100,
            cellClass: "center"
      }
      ...
];

另一个想法是循环你的文字,用价值观取代所有的承诺。然而,我不知道如果你打电话给我,当一个承诺已经解决时会发生什么

angular.forEach($scope.myDefs, function(element){
   element.displayName.then(function(result){
      element.displayName= result;
   })
})

你需要有一个直接的推荐人。或在引用上具有闭包的辅助函数。比如:

$scope.myDefs = [
    ...
    createArrayObject({
        field: 'supplier',
        displayName: $translate('Supplier'),
        cellTemplate: "<div class=\"ngCellText\">...</div>"        
    }),
    createArrayObject(.....

]
更新

正如Brian在下面所建议的,编写通用代码始终是一个好主意,您可以在所有地方使用

var forEach = angular.forEach,
    isFunction = angular.isFunction;

function resolveProperties(obj){
    forEach(obj,function(val,key){
        if(isFunction(val.then)){
            val.then(function(data){
                obj[key] = data;
            });
        }
    });
}
所以你可以像这样使用它

[
    resolveProperties({
        myPropertyToResolve: promiseReturningFunction() 
    }),
    ....   
]

如果您知道不存在异步内容,可以使用
$translate.instant()
,其行为与1.x中的
$translate()
完全相同。

如果您使用的是ui网格,解决方案是将headerCellFilter:“translate”添加到columnsDefs(表示myDefs)中,并且displayName必须具有转换键

这是

$scope.myDefs=[
{
字段:'供应商',
显示名称:“供应商”,
单元模板:“…”,
headerCellFilter:“翻译”
},
{
字段:“供应商规模”,
显示名称:“大小”,
宽度:100,
单元课:“中心”,
headerCellFilter:“翻译”
}

];你可以用“this”引用“then”中的当前对象文本上下文。myDefs必须是一个数组,我将它与第三方库一起使用,
这个
是未定义的…哦,对了,但是在对象文本中调用函数没有好处,因为你不会返回任何东西是的,这是我的问题。在angular translate更改其实现之前,我可以只翻译文本中的单词,现在我得到了一个承诺。我没有一个简单的方法来解决这个问题。直接引用很难实现,因为它是一个数组。@calebboyd,我喜欢这种方法。仔细考虑后,我建议您将其拆分一点,并将其改为一个
$invoke
可调用的服务。我希望您可以“关注”一个问题,而不必将其标记为收藏夹。或“接受时通知”。我知道有一种非常巧妙的方法可以做到这一点,但现在是星期天晚上,我的大脑无法正常工作。我很喜欢下面@calebboyd的答案,但有些东西告诉我,有一种方法可以创建自定义服务来做你想做的事情。。。这就是他所做的,只是没有抽象到服务层。
var forEach = angular.forEach,
    isFunction = angular.isFunction;

function resolveProperties(obj){
    forEach(obj,function(val,key){
        if(isFunction(val.then)){
            val.then(function(data){
                obj[key] = data;
            });
        }
    });
}
[
    resolveProperties({
        myPropertyToResolve: promiseReturningFunction() 
    }),
    ....   
]