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

时间:2014-11-10 02:37:26

标签: angularjs angularfire

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

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

现在我试图通过$ asArray(来自firebase)的虚拟事件数据来做这件事。

我收到错误""错误:项目未定义"。据我了解,这是因为过滤器和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);
      });

Plunker

1 个答案:

答案 0 :(得分:3)

只需编写过滤器,以满足第一个未定义的参数。

e.g。

.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);
      });

Angular将在每个摘要上调用您的过滤器,其中包括页面首次加载时,在数据从数据库异步加载之前。因此,如果首先没有加载数据,那么所有代码​​都需要正常工作。 || <default value>if (!param) return;是您的朋友。