我正在过滤器中执行一项非常常规的任务来检查是否
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/