简体   繁体   English

如何在异步事件后触发角度过滤器

[英]How to fire angular filter after async event

I have this simple angular filter based on an injected value. 我有一个基于注入值的简单角度滤波器。 I need to initialize the value asyncrhonously, receiving the data from a $http response. 我需要异步初始化该值,并从$http响应中接收数据。 The point is that even if the value has been set correctly, the filter once has been evalueted does not fire a second time. 关键是,即使正确设置了该值,对过滤器进行一次评估也不会再次触发。 I tried to put $scope.$apply() after angular.module("app").value("deferredValue", "foo"); 我试图将$scope.$apply() angular.module("app").value("deferredValue", "foo"); but in this case I get an error because the $digest is already in progress. 但是在这种情况下,由于$digest已经在执行中,所以我得到一个错误。 How can I fix my code to make it work? 如何修复我的代码以使其正常工作?

 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> 

you should use statefull filter 你应该使用statefull过滤器

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 https://docs.angularjs.org/guide/filter#stateful-filters

use model, that can be pass as parameter to the filter. 使用模型,可以将其作为参数传递给过滤器。

app
.value("deferredObj", {value:''})
.filter("myfilter", [function(){
  return function(input, defered){
    if(defered == input)
      return "1234";
    else
      return "4321";
  };
}])
.controller("ctrl", ["$scope","http", 'deferredObj', function($scope, http, deferredObj){
  $scope.test = "foo";
  $scope.deferredObj = deferredObj;
  http.get("http://www.google.com").then(function(list){
    $scope.deferredObj.value = 'foo';
  }).catch(function(){
    $scope.deferredObj.value = 'foo';
  });
}]);

markup: 标记:

{{test | myfilter : deferredObj.value}}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM