AngularJS .length返回TypeError

时间:2015-02-03 08:04:32

标签: 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;      
}

}])

但在我的控制台中它会触发错误: TypeError: Cannot read property 'length' of undefined

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

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

有什么想法吗?

更新的 深入研究代码,看起来过滤器在之前应用了AJAX调用。最初filterObj未定义,然后在加载数据后立即填充。有没有办法延迟注入过滤器,直到加载数据,如承诺?

谢谢你的时间!

2 个答案:

答案 0 :(得分:1)

  

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

如果尝试访问未定义的对象上的属性,则会出现此类型错误。在控制台试试这个:

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

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

答案 1 :(得分:0)

我想知道为什么元素是未定义的,并且可能在If语句之前将它声明为空的对象或数组。