Google maps 用敲除过滤谷歌标记

Google maps 用敲除过滤谷歌标记,google-maps,knockout.js,Google Maps,Knockout.js,我一直在努力解决这个问题,但运气不好。我已经查过其他帖子了,运气不好。我想我的代码有一个错误,我的目标是能够过滤列表并只显示/隐藏列表上的标记。下面是代码示例: 以下是由于某种原因无法工作的代码示例: self.filteredPlaces = ko.computed(function() { var filter = self.filter().toLowerCase(); if (!filter) { ko.utils.arrayForEach(self.pl

我一直在努力解决这个问题,但运气不好。我已经查过其他帖子了,运气不好。我想我的代码有一个错误,我的目标是能够过滤列表并只显示/隐藏列表上的标记。下面是代码示例:

以下是由于某种原因无法工作的代码示例:

self.filteredPlaces = ko.computed(function() {
    var filter = self.filter().toLowerCase();
    if (!filter) {
        ko.utils.arrayForEach(self.placeList(), function (placeItem) {
        placeItem.marker.setVisible(true);
      });
      return self.placeList();
    } else {
      return ko.utils.arrayFilter(self.placeList(), function(placeItem) {
        // set all markers visible (false)
        var result = (placeItem.city.toLowerCase().search(filter) >= 0);
        placeItem.marker.setVisible(result);
        return result;
      });
    }
  }, this);

谢谢

为了过滤标记,您需要做一些事情

您的第一个问题是这一行:

    placeItem.marker.setVisible(true);
Place项没有基于构造函数的标记对象。所以,你必须加上它。我更改了Place构造函数以添加一个marker对象(见下文)

})

并用它来初始化对象。最后,我更改了filteredPlaces函数,它需要订阅可观察的查询,以便在键入文本时,地图上的标记会相应调整

   self.query.subscribe(function() {
    var filter = self.query().toLowerCase();
        if (!filter) {
            ko.utils.arrayForEach(self.placeList(), function (placeItem) {
                placeItem.marker.setMap(map);
            });
            return self.placeList();
        } else {
            ko.utils.arrayForEach(self.placeList(), function(placeItem) {
                var result = (placeItem.city.toLowerCase().search(filter) >= 0);

                if(result)
                    placeItem.marker.setMap(map);
                else
                    placeItem.marker.setMap(null);
            });
        }
    });

抛出错误是因为
placeItem
中没有
marker
属性,我如何将这些属性赋予“placeItem”您的小提琴中有一个javascript错误:
Uncaught TypeError:无法读取未定义的属性“映射”
   self.query.subscribe(function() {
    var filter = self.query().toLowerCase();
        if (!filter) {
            ko.utils.arrayForEach(self.placeList(), function (placeItem) {
                placeItem.marker.setMap(map);
            });
            return self.placeList();
        } else {
            ko.utils.arrayForEach(self.placeList(), function(placeItem) {
                var result = (placeItem.city.toLowerCase().search(filter) >= 0);

                if(result)
                    placeItem.marker.setMap(map);
                else
                    placeItem.marker.setMap(null);
            });
        }
    });