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