未捕获的TypeError:无法读取属性' setVisible'未定义,使用敲除过滤

时间:2017-01-06 10:32:37

标签: javascript knockout.js filtering

我想根据搜索结果过滤数组。我想出了这段代码,但它显示错误: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());

1 个答案:

答案 0 :(得分:0)

您的错误表明它正在尝试读取未定义引用的属性(setVisible)。您可以通过简单搜索setVisible并查看问题所在位来跟踪此情况:marker循环中的for未定义或else中的for(var i = 0; i < self.location.length; i++) { }是块。您有2个错误可能导致您在任何一个位置出现问题:

  1. self.location().length:你需要检查ko.utils.arrayFilter(locations, function(item) {,否则你要求observable的长度属性,而不是数组。

  2. self.locations():您需要传递splice,否则您实际上并未向该函数提供数组。

  3. 使用observable与基础数据这两个问题似乎都是错误的。您必须像函数一样调用observable以读取基础数据。例外情况是淘汰定义的函数,例如removeAll()IDB_01d BITMAP "<path>" ,用于可观察量。