我想在我的控制器中使用$translate
,当我更改语言时,所有字符串都会被翻译,这在我使用时会起作用:{{'Menu.CANDIDATURES.VIEW' | translate}}
但我也希望在我的控制器上使用它。 / p>
为此,我使用$watch
如下:
.controller('CandidaturesDatatableCtrl', function ($scope, DTOptionsBuilder, DTColumnBuilder, $filter) {
$scope.view = '';
$scope.update = '';
$scope.delete = '';
$scope.$watch(
function() { return $filter('translate')('ACTIONS.VIEW'); },
function(newval) { $scope.view = newval; console.log(newval); }
);
$scope.$watch(
function() { return $filter('translate')('ACTIONS.UPDATE'); },
function(newval) { $scope.update = newval }
);
$scope.$watch(
function() { return $filter('translate')('ACTIONS.DELETE'); },
function(newval) { $scope.delete = newval }
);
// deleted code
.renderWith(function(data, type, full, meta) {
if (true) {
return '<button class="btn btn-blue btn-primary btn-ef btn-ef-5 btn-ef-5b mb-10"><i class="fa fa-trash"></i> <span>'+$scope.view+'</span></button> '
+ '<button class="btn btn-bl btn-success btn-ef btn-ef-5 btn-ef-5b mb-10"><i class="fa fa-trash"></i> <span>'+$scope.update+'</span></button> '
+ '<button class="btn btn-danger btn-rounded btn-ef btn-ef-5 btn-ef-5b mb-10"><i class="fa fa-trash"></i> <span>'+$scope.delete+'</span></button>';
} else {
return '';
}
})
];
});
$watch
工作正常,因为您可以在我的代码中看到有console.log(newval)
记录新的翻译,但是$ scope.view,$ scope.update和$ scopte.delete没有得到我改变语言后翻译,所以我需要刷新页面才能看到新的翻译。
我该如何解决?
正如你所看到的,我写的代码非常难看,如果你知道其他方式,我将不胜感激。
我尝试使用$translateChangeSuccess
事件代替$watch
,如下所示:
.controller('CandidaturesDatatableCtrl', function ($scope, DTOptionsBuilder, DTColumnBuilder, $filter, $rootScope, $translate) {
$scope.view = $filter('translate')('ACTIONS.VIEW');
$scope.update = $filter('translate')('ACTIONS.UPDATE');
$scope.delete = $filter('translate')('ACTIONS.DELETE');
$rootScope.$on('$translateChangeSuccess', function() {
$translate(['ACTIONS.VIEW','ACTIONS.UPDATE','ACTIONS.DELETE']).then(function (newval) {
console.log(newval);
$scope.view = newval['ACTIONS.VIEW'];
$scope.update = newval['ACTIONS.UPDATE'];
$scope.delete = newval['ACTIONS.DELETE'];
});
});
//...
DTColumnBuilder.newColumn(null).withTitle('Actions').notSortable()
.renderWith(function(data, type, full, meta) {
if (true) {
return '<button class="btn btn-blue btn-primary btn-ef btn-ef-5 btn-ef-5b mb-10"><i class="fa fa-trash"></i> <span>'+$scope.view+'</span></button> '
+ '<button class="btn btn-bl btn-success btn-ef btn-ef-5 btn-ef-5b mb-10"><i class="fa fa-trash"></i> <span>'+$scope.update+'</span></button> '
+ '<button class="btn btn-danger btn-rounded btn-ef btn-ef-5 btn-ef-5b mb-10"><i class="fa fa-trash"></i> <span>'+$scope.delete+'</span></button>';
} else {
return '';
}
})
];
});
但它不起作用我的行为与使用$watch
时的行为相同。
要查看我的代码是如何工作的,这是我加载它时的页面状态:
上一页是法语,然后我将其更改为英语:
你可以看到除了我在控制器中翻译的Afficher
,Modifier
和Supprimer
之外,所有标签都被翻译成了英文,你可以注意到控制台中的日志$translateChangeSuccess
已经有效,但无法更改视图中的值。
答案 0 :(得分:1)
不想看到那些观察者......你实际上可以听一些事件,即$ translateChangeSuccess
这里是plunker:http://plnkr.co/edit/njVZQ2plsXK95JvuxP1J?p=preview
$rootScope.$on('$translateChangeSuccess', function(){
$translate(['ACTIONS.VIEW', 'ACTIONS.UPDATE']).then(function (result) {
$scope.view = result['ACTIONS.VIEW'];
$scope.update= result['ACTIONS.UPDATE'];
});
});