javascript - AngularJS .length 返回 TypeError

标签 javascript angularjs console angularjs-filter

我正在过滤器中执行一项非常常规的任务来检查是否

    angular.module('someApp')
     .filter('filterSomeData',['$filter',function ($filter) {
      return function (items, keyObj) {
    var filterObj = {
      data:items,
      filteredData:[],
      applyFilter : function(query,key){
        var fData = [];
        //unfiltered data at the start
        if(this.filteredData.length === 0){
          this.filteredData = this.data;
        }
        if(query){              
          var fObj = {};         
          if(!angular.isArray(query)){
            fObj[key] = query;
            angular.forEach(fObj, function(fObj, i){
                    fData = fData.concat(
                      $filter('filter')
                      (this.filteredData,fObj));
                }, this);
            console.log(this.filteredData);
          }
          else if(angular.isArray(query)){
            console.log(query);
            if(query.length > 0){ 
              for(var i=0;i<obj.length;i++){
                if(angular.isDefined(query[i])){
                  fObj[key] = query[i];
                  angular.forEach(fObj, function(fObj, i){
                          fData = fData.concat(
                            $filter('filter')
                            (this.filteredData,fObj));
                      }, this);
                }
              }

            }                   
          }                 
          if(fData.length > 0){
            this.filteredData = fData;
          }
          else{
            this.filteredData;
          }
        }
      }
  };

  if(keyObj){
    angular.forEach(keyObj,function(query,key){
      filterObj.applyFilter(query,key);          
    });     
  }

  return filterObj.filteredData;      
}

}])

但在我的控制台中它引发了一个错误: 类型错误:无法读取未定义的属性“长度”

即使我们假设在检查时未定义 this.filteredData,我也无法理解为什么 .length 会引发错误。

功能完全不受影响,但我想确保我的控制台是干净的。

有什么想法吗?

更新: 深入研究代码,看起来过滤器是在 AJAX 调用完成之前应用的。最初,filterObj 是未定义的,然后在数据加载后立即填充。有没有办法像 promise 一样延迟过滤器的注入(inject),直到数据加载?

感谢您的宝贵时间!

最佳答案

Even if we assume this.filteredData isn't defined at the time when checked, I cannot understand why .length fires an error.

如果您尝试访问 undefined object 上的属性,则会出现此类型错误。在控制台尝试一下:

a = {b:'four'}
a.b.length
4
a.c.length
 Uncaught TypeError: Cannot read property 'length' of undefined

因此,如果 this.filteredData 不存在,则无法访问 length 属性。

关于javascript - AngularJS .length 返回 TypeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28294038/

相关文章:

javascript - 匹配行尾 javascript 正则表达式

javascript - localStorage无法传输数据,不适用于所有浏览器

javascript 计算每个表行的类出现次数并在另一个表中汇总

javascript - Typescript - 条件要求

javascript - 使用 angularJs ng-Pattern 进行 10 位正则表达式验证

AngularJS + Jersey RESTful 后端 : Authentication & Authorization

amazon-web-services - aws控制台打不开

angularjs - 为什么使用 ngMock 包装第三方 Promise 时 $q.when 无法解析?

c - fork() 进程中的 IO 流

javascript - 使用控制台更改主体的背景颜色