$ locale更新或强制fitler重新计算

时间:2015-09-09 12:26:34

标签: angularjs

我使用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,这实际上归结为强制所有过滤器重新计算。

3 个答案:

答案 0 :(得分:0)

所以看起来这可能无法直接使用$ locale服务。对于那些基本上想做同样事情的人来说,看看这个SO链接:

Angularjs and $locale

答案 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/