Angularjs 如何使自定义筛选器在项目未定义和异步加载时等待?

Angularjs 如何使自定义筛选器在项目未定义和异步加载时等待?,angularjs,angularfire,Angularjs,Angularfire,我有一个自定义过滤器在ng repeat中工作。ng repeat中的物品来自名为firebase的BaaS 我试图让用户按日期筛选事件(3天、7天等)。我为此编写了一个自定义过滤器,它可以处理虚拟数据 现在我正试图通过$asArray(来自firebase)传入的虚拟事件数据来实现这一点 我得到错误“error:items未定义”。据我所知,这是因为filter和ng repeat试图在数据加载之前调用它 我猜我的过滤器中需要一些逻辑,如果items===undefined,请等待它加载。我不

我有一个自定义过滤器在ng repeat中工作。ng repeat中的物品来自名为firebase的BaaS

我试图让用户按日期筛选事件(3天、7天等)。我为此编写了一个自定义过滤器,它可以处理虚拟数据

现在我正试图通过$asArray(来自firebase)传入的虚拟事件数据来实现这一点

我得到错误“error:items未定义”。据我所知,这是因为filter和ng repeat试图在数据加载之前调用它

我猜我的过滤器中需要一些逻辑,如果
items===undefined
,请等待它加载。我不知道如何编写逻辑来完成此操作。我尝试了$timeout,但无法使其工作

以下是过滤器部分:

.filter('upComing', function() {

//    if (items === undefined){    
//     WAIT UNTIL it loads!

      return function(items, field, days){
         var timeStart = Date.now();
         var timeEnd = Date.now() + (days * 86400000); // 1 day in ms
      return items.filter(function(item){
         return (item[field] > timeStart && item[field] < timeEnd);
      });
.filter('coming',function(){
//如果(项===未定义){
//等它装好!
退货功能(项目、字段、天数){
var timeStart=Date.now();
var timeEnd=Date.now()+(天*86400000);//1天(毫秒)
返回项目。过滤器(函数(项目){
返回(项[field]>timeStart和项[field]

只需编写过滤器,使其符合未定义的第一个参数

e、 g

.filter('coming',function(){
退货功能(项目、字段、天数){
var timeStart=Date.now();
var timeEnd=Date.now()+(天*86400000);//1天(毫秒)
返回(项| |[])。筛选(函数(项){
返回(项[field]>timeStart和项[field]

Angular将在从数据库异步加载数据之前,对每个摘要调用您的筛选器,包括页面首次加载的时间。因此,如果数据未首先加载,则所有代码都需要正常工作。
|
if(!param)return;
你是这里的朋友。

这很有帮助,但我还没有完全解决。如果数组还没有,那么
|【】
会不会返回一个空白数组呢?现在似乎就是这样。不会得到错误,但也不会得到数据。是的,你是对的,
|【】
将从此筛选器返回一个空白数组。但是,由于每当输入发生更改时都会调用筛选器,因此在加载数据时将对其进行重新评估。您的筛选器无法工作的真正原因是因为它有一些错误。我已修复并修复了它,因此当您单击其中一个链接时,它会显示数据。Mister Australia@GregL,您是B绝对是我的夜晚。我自己也不会明白这一点。我现在需要去读一下
parse
做了什么。我不能告诉你我有多感激这一点。很高兴我能帮上忙。Angular用它将表达式转换成可以根据特定范围计算的函数。另外,别忘了接受我的答案。
.filter('upComing', function() {
      return function(items, field, days){
         var timeStart = Date.now();
         var timeEnd = Date.now() + (days * 86400000); // 1 day in ms
      return (items || []).filter(function(item){
         return (item[field] > timeStart && item[field] < timeEnd);
      });