我想根据搜索结果过滤数组。我想出了这段代码,但它显示错误:Uncaught TypeError: Cannot read property 'setVisible' of undefined
var viewmodel = function(){
var self = this;
self.location = ko.observableArray(locations)
self.query = ko.observable('');
//filtering
self.filteredItems = ko.computed(function() {
var query = self.query().toLowerCase(); // to convert to lowercase
if(!query) {
for(var i = 0; i < self.location.length; i++) {
self.location()[i].marker.setVisible(true);
}
return self.location();
}
else {
return ko.utils.arrayFilter(locations, function(item) {
var match = item.title.toLowerCase().indexOf(query)!==-1;
item.marker.setVisible(match); //display the filtered markers ,**error is shown in this line**
return match;
})
}
}, self)
}
ko.applyBindings(new viewmodel());
答案 0 :(得分:0)
您的错误表明它正在尝试读取未定义引用的属性(setVisible
)。您可以通过简单搜索setVisible
并查看问题所在位来跟踪此情况:marker
循环中的for
未定义或else
中的for(var i = 0; i < self.location.length; i++) {
}是块。您有2个错误可能导致您在任何一个位置出现问题:
self.location().length
:你需要检查ko.utils.arrayFilter(locations, function(item) {
,否则你要求observable的长度属性,而不是数组。
self.locations()
:您需要传递splice
,否则您实际上并未向该函数提供数组。
使用observable与基础数据这两个问题似乎都是错误的。您必须像函数一样调用observable以读取基础数据。例外情况是淘汰定义的函数,例如removeAll()
或IDB_01d BITMAP "<path>"
,用于可观察量。