2015-09-09 106 views
1

我正在使用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/

所以我需要一种方法为$语言环境进行更新,这实际上可以归结为迫使所有的过滤器重新计算。

+0

怎么样的解决方案,像[这](http://jsfiddle.net/davidepastore/wf8ojqjg/1/)? –

+0

我有数组遍布我的应用程序,所以这是行不通的。 –

+0

它们是否共享相同的结构?您可能有兴趣使用[服务](https://docs.angularjs.org/guide/services)。 –

回答

0

因此,基于一些研究它看起来像要做到这一点的唯一方法是覆盖原来的datefilter像这样:

.config(function ($provide) { 
    $provide.decorator('dateFilter', function ($delegate) { 
     $delegate.$stateful = true; 
     return $delegate; 
    }); 
}) 

这是无证只有在角新版本存在。你可以看到这个修补程序在小提琴上工作:http://jsfiddle.net/y8bobe6g/

0

所以看起来这可能不能直接与$ locale服务。看看这个链接SO有人基本上想要做同样的事情:

Angularjs and $locale

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

我没有这可以被认为是正确的,也没有完美的解决方案,因为有在再生阵列和消耗越来越多的内存没有任何意义。

使用它的责任。

+0

我已经遍布我的应用程序,不能再生数组。 –