我使用angularjs 1.4.4
我试图动态更新$ locale并且正在更新。当过滤器运行时,它使用正确更新的$ locale来评估自身。不幸的是,旧的过滤器不会重新运行。
var englishMonths = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
var frenchMonths = ["janvier", "f\u00e9vrier", "mars", "avril", "mai", "juin", "juillet", "ao\u00fbt", "septembre", "octobre", "novembre", "d\u00e9cembre"];
$scope.array = [];
$scope.currentDate = 'english';
$scope.addDate = function(){
$scope.array.push(new Date());
};
$scope.switchDate = function(){
var monthArray = englishMonths
if($scope.currentDate === 'english'){
monthArray = frenchMonths;
$scope.currentDate = 'french';
}
else{
$scope.currentDate = 'english';
}
$locale.DATETIME_FORMATS.MONTH.length = 0;
for(var x = 0; x < monthArray.length; x++){
$locale.DATETIME_FORMATS.MONTH.push(monthArray[x] + ($scope.currentDate === 'french' ? "FRENCH" : ''));
}
};
在dom中:
<button data-ng-click="addDate()">Add Date</button>
<button data-ng-click="switchDate()">Toggle Language, current: {{ currentDate }}</button>
<hr></hr>
<div data-ng-repeat="date in array">
{{ date | date:'longDate' }}
</div>
如果您向数组添加日期,它将使用当前语言进行评估。如果您更改语言,则旧日期不会重新评估。
你可以在我提出的小提琴中看到这一点:http://jsfiddle.net/wf8ojqjg/
所以我需要一种方法来更新$ locale,这实际上归结为强制所有过滤器重新计算。
答案 0 :(得分:0)
所以看起来这可能无法直接使用$ locale服务。对于那些基本上想做同样事情的人来说,看看这个SO链接:
答案 1 :(得分:0)
有趣的问题!
正如其他人所提到的,过滤器不会被摘要循环更新,因为他们“观察”的对象的实例不会改变,因此不会重新应用。
此“问题”的一个解决方法是使用“新”日期重新生成示例中的日期数组,因此将触发过滤器。
看看这个更新的JSFiddle:http://jsfiddle.net/wf8ojqjg/3/
angular
.module('app', [])
.controller('ParentCtrl', ParentCtrl)
function ParentCtrl($scope, $locale) {
var englishMonths = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ];
var frenchMonths = ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre',
'octobre', 'novembre', 'décembre'];
$scope.arrays = {
dates: []
};
$scope.currentDate = 'english';
$scope.addDate = function(){
$scope.arrays.dates.push(new Date());
};
$scope.switchDate = function(){
var monthArray = englishMonths
if($scope.currentDate === 'english') {
monthArray = frenchMonths;
$scope.currentDate = 'french';
} else {
$scope.currentDate = 'english';
}
$locale.DATETIME_FORMATS.MONTH = monthArray;
$scope.arrays.dates = renewInstancesOfArrayOfDates($scope.arrays.dates);
};
var renewInstancesOfArrayOfDates = function(array) {
var temp = [];
angular.forEach(array, function(t) {
temp.push(new Date(t));
});
return temp;
};
}
我不认为这是一个合适而不优雅的解决方案,因为重新生成数组并消耗越来越多的内存是没有意义的。
责任使用。
答案 2 :(得分:0)
所以基于一些研究,看起来这样做的唯一方法是覆盖原来的日期过滤器,如下所示:
app.controller('ClassesCtrl', function($scope, $stateParams){
$scope.foo = "bar";
});
app.controller('ClassCtrl', function($scope, $stateParams){
console.log($scope.foo);
});
这是未记录的,仅存在于较新版本的角度中。您可以在此处看到修补程序正在处理小提琴:http://jsfiddle.net/y8bobe6g/