[英]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;
}])
使用模型,可以将其作为参数传递给过滤器。
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.