6

angular-translate 2.0 版中,$translate 服务不再返回实际的翻译,而是一个承诺。我可以看到这是一个好主意,因为可能正在进行一些异步加载。但这让我很困惑如何在我的情况下正确使用该服务,因为我在对象文字中使用了 $translate 服务,就像这样

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

问题:如何在对象字面量中使用 Promise?

它应该(根据文档)像这样使用:

$translate('HEADLINE').then(function (headline) {
    $scope.headline = headline;
});
4

4 回答 4

14

如果您知道没有异步操作,您可以使用$translate.instant()其行为与$translate()1.x 中的完全相同。

于 2014-03-12T11:20:58.947 回答
6

你需要有一个直接的参考。或者一个对引用有闭包的辅助函数。喜欢:

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

]

和其他地方

function createArrayObject(obj){
    obj.displayName.then(function(data){
       obj.displayName = data;
    });
    return obj;  
}

更新

正如 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() 
    }),
    ....   
]
于 2014-02-23T23:30:33.627 回答
3

如果您使用 ui-grid,解决方案是将 headerCellFilter: 'translate' 添加到 columnsDefs (表示 myDefs)并且 displayName 必须具有翻译键。

这是,

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

于 2015-11-06T08:26:57.900 回答
0

另一个想法是遍历您的文字并用值替换所有承诺。但是,我不知道如果您在承诺已经解决时打电话会发生什么。

angular.forEach($scope.myDefs, function(element){
   element.displayName.then(function(result){
      element.displayName= result;
   })
})
于 2014-02-23T23:30:23.097 回答