过滤器不刷新

Elf*_*yer 8 angularjs angular-filters

我正在使用本地化过滤器刷新问题.加载文件后,视图不会刷新.我试过$scope.$apply()$filter("localization")(localizationService.text),也不是工作.

本地化服务:

angular
    .module("myApp")
    .factory("localizationService", function () {
        var service = {
            text: null,
            language: "en"
        };

        return service;
    });
Run Code Online (Sandbox Code Playgroud)

定位过滤器:

angular
    .module("myApp")
    .filter("localization", function(localizationService) {
        return function (value) {
            if (localizationService.text && localizationService.text.hasOwnProperty(value)) {
                return localizationService.text[value];
            }
            return value;
        }
    });
Run Code Online (Sandbox Code Playgroud)

控制器自动刷新要使用的文件:

    $scope.$watch(function () {
        return $location.path();
    }, function () {
        var fileName = "../Localizations/" + $location.path().substring(1) + "/localization-" + localizationService.language + ".json";

        $http.get(fileName).then(function (response) {
            localizationService.text = response.data;
            //$filter("localization")(localizationService.text);
            //$scope.$apply();
        });
    });
Run Code Online (Sandbox Code Playgroud)

本地化en.json:

{
  "test": "this is working !"
}
Run Code Online (Sandbox Code Playgroud)

HTML:

<div>{{'test' | localization}}</div>
Run Code Online (Sandbox Code Playgroud)

此代码写test而不是this is working !.

我怎样才能解决这个问题 ?

tas*_*ATT 25

从版本1.3.0-rc.2开始,过滤器默认为无状态.这意味着,如果左侧表达式发生更改,则仅重新评估已过滤的表达式.

你有这个:

<div>{{'test' | localization}}</div>
Run Code Online (Sandbox Code Playgroud)

test 在这种情况下显然永远不会改变,所以整个表达式只会被评估一次.

您需要将过滤器标记为有状态:

app.filter("localization", function(localizationService) {

  function localization(value) {

    if (localizationService.text && localizationService.text.hasOwnProperty(value)) {
      return localizationService.text[value];
    }
    return value;
  }

  localization.$stateful = true;

  return localization;
});
Run Code Online (Sandbox Code Playgroud)

演示: http ://plnkr.co/edit/YIzmH3lR9350McprusAA?p=preview