6

angular-translateバージョン 2.0 では、$ translate サービスは実際の翻訳ではなく、promise を返します。非同期の読み込みが行われている可能性があるため、これは良い考えであることがわかります。しかし、このようにオブジェクトリテラル内で $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

非同期処理が行われていないことがわかっている場合は、1.x$translate.instant()とまったく同じように動作する whichを使用できます。$translate()

于 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;  
}

アップデート

ブライアンが以下で提案したように、あらゆる場所で使用できる汎用コードを作成することは常に良い考えです。

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

別のアイデアは、リテラルをループして、すべての約束を値に置き換えることです。ただし、Promise が既に解決されている場合に電話するとどうなるかはわかりません。

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