【发布时间】:2017-02-19 21:22:05
【问题描述】:
我有这个基于注入值的简单角度过滤器。
我需要异步初始化值,从$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>
【问题讨论】:
-
您可以在过滤器中初始化数据。请查看这个问题:LINK
-
除非
test的值发生变化,否则不会调用过滤器。你可以让它有状态,但是它会在每个摘要循环中被调用。 -
当您将
deferredValue设置为空字符串时,它将被注入您的过滤器。更新此服务不会将服务重新注入过滤器。如果您通过代码进行调试,您可以看到将值更新为foo确实调用了过滤器,但deferredValue的值仍然是一个空字符串。您始终可以在控制器范围内设置deferredValue并将其传递给您的过滤器 -
@zeroflagL 你是最好的答案。请在下面输入,以便我接受。我尝试修改过滤器并完美运行。谢谢。
-
强烈建议不要通过 Angular 本身编写有状态的过滤器。你为什么不使用模型,它可以作为参数传递给过滤器。
标签: javascript angularjs promise angular-filters angular-http