javascript - 如何在异步事件后触发 Angular 过滤器

标签 javascript angularjs promise angular-filters angular-http

我有这个基于注入(inject)值的简单 Angular 过滤器。 我需要异步初始化值,从 $http 响应接收数据。 关键是即使值设置正确,过滤器一旦被评估也不会触发第二次。我试图在 angular.module("app").value("deferredValue", "foo"); 之后放置 $scope.$apply() 但在这种情况下我得到一个错误,因为 $digest 已经在进行中。 如何修复我的代码以使其正常工作?

angular.module("app", [])
.value("deferredValue", "")
.filter("myfilter", ["deferredValue", function(deferredValue){
  return function(input){
    if(deferredValue == input)
      return "1234";
    else
      return "4321";
  };
}])
.controller("ctrl", ["$scope","$http", function($scope, $http){
  $scope.test = "foo";
  
  $http.get("http://www.google.com").then(function(){
    angular.module("app").value("deferredValue", "foo");
  }).catch(function(){
    angular.module("app").value("deferredValue", "foo");
  });
}])
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div ng-app="app" ng-controller="ctrl">
  {{test | myfilter}}
</div>

最佳答案

你应该使用有状态过滤器

filter("myfilter", ["deferredValue", function(deferredValue){
    function filter(input){
       if(deferredValue == input)
           return "1234";
       else
           return "4321";
    };
    filter.$stateful = true;

    return filter;
}])

https://docs.angularjs.org/guide/filter#stateful-filters

关于javascript - 如何在异步事件后触发 Angular 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39975474/

相关文章:

javascript - 从 Promise.all 返回不会从包装函数返回

javascript - Bluebird promises - 嵌套与拒绝模式

javascript - 如何在 spidermonkey JavaScript 中获取控制台输入?

javascript - 一种在不改变布局的情况下替换文本的解决方案(jQuery)

javascript - Cordova 插件不适用于 ionic

angularjs - Spring Security REST 和 Angular

angularjs - 更改 fullCalendar 的 slotDuration

javascript - 您可以直接使用 .then 调用异步函数/方法吗?

javascript - 如何回到 HTML5 Canvas 的历史

javascript - 使用 ajax 保存时 ckeditor 无法发布结果