繁体   English   中英

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

[英]How to fire angular filter after async event

我有一个基于注入值的简单角度滤波器。 我需要异步初始化该值,并从$http响应中接收数据。 关键是,即使正确设置了该值,对过滤器进行一次评估也不会再次触发。 我试图将$scope.$apply() angular.module("app").value("deferredValue", "foo"); 但是在这种情况下,由于$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> 

你应该使用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

使用模型,可以将其作为参数传递给过滤器。

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';
  });
}]);

标记:

{{test | myfilter : deferredObj.value}}

暂无
暂无

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

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