我正在我的过滤器中执行一项非常常规的任务来检查是否
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未定义,然后在加载数据后立即填充。有没有办法延迟注入过滤器,直到加载数据,如承诺?
谢谢你的时间!
答案 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语句之前将它声明为空的对象或数组。