我在我的过滤器中执行一项非常例行的任务来检查
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是未定义的,然后在加载数据后立即填充。是否有办法像承诺的那样,将过滤器的注入推迟到加载数据为止?
耽误您时间,实在对不起!
发布于 2015-02-03 00:25:09
即使我们假设在检查时没有定义this.filteredData,我也不明白为什么.length会触发错误。
如果尝试访问未定义对象的属性,则会得到此类型错误。在控制台上试一试:
a = {b:'four'}
a.b.length
4
a.c.length
Uncaught TypeError: Cannot read property 'length' of undefined
因此,如果this.filteredData不存在,则无法访问length属性。
发布于 2015-02-03 00:07:44
我会了解为什么元素是未定义的,并且可能在If语句之前的某个地方将其声明为空对象或数组。
https://stackoverflow.com/questions/28294038
复制