-1

我做使用,使用标记来标记预定义位置,如列表中的谷歌地图API动态地图:GoogleMapsAPI - 创建标记筛选

self.locations = [{ 
     name: 'Foxtrot', 
     lat: 38.713905, 
     lng: -9.1518868, 
     type: 'Bar' 
    } 

它也有一个搜索栏,允许你可以根据位置名称进行过滤(filteredNav)。它也应该过滤标记,但是...这是问题。

的建议,我有如下:

尝试写的console.log(self.location_array());.因为位置和 标记数据模式是不同的,你必须通过循环 self.location_array()通过调用标记对象上的setVisible(或setMap)来处理和查找要显示哪一个,哪一个 隐藏。

这是我的代码:

// Create observable array 
self.nav = ko.observableArray(self.locations); 
// Create empty observable string 
self.filter = ko.observable(''); 
// Show nav and filter 
self.filteredNav = ko.computed(function() { 

    var filter = self.filter().toLowerCase(); 

    if (!filter) { 
     return self.nav(); 
    } 
    return self.nav().filter(function(i) { 
     // Check for proper casing or lowercase 
     return i.name.toLowerCase().indexOf(filter) > -1 || i.name.indexOf(filter) > -1; 
    }); 

    //THIS IS THE PROBLEM! 
    for (var i = 0; i < location_array()[i].length; i++) { 
    //?????? 
     location_array()[i].setVisible(true); 
    }//????? 

} 

注:观察到阵列实现:vm.location_array()[i]

Link to the project

所以......问题是......我该怎么办循环?我不知道该怎么做......

回答

0

首先,你提出的代码有一些'神秘'的部分。例如,什么是self,什么是ko,什么是observableArray等等。人们只能猜测这些都是什么。

所以我会简单地向你介绍如何实现你想要的一般逻辑。

逻辑非常简单。

您筛选侧边栏的地方用同样的方法,当你键入,你应该过滤标记列阵调用setVisibletruefalse

这意味着,当您创建的标记,你应该存储他们到一个单独的数组。

此外,当您创建标记时,例如

var marker = new google.maps.Marker({ 
    map: map, 
    position: new google.maps.LatLng(latitude, longitude) 
}) 

添加name财产,或类似的东西,它,像这样

var marker = new google.maps.Marker({ 
    map: map, 
    position: new google.maps.LatLng(latitude, longitude), 
    name: 'Foxtrot` 
}) 

让您创建有name属性,你可以用它来筛选标记的阵列。

因此,为了筛选的标记数组,你应该简单地遍历数组,并检查每个对象的.name财产,如果名称不搜索输入,只需在标记setVisible(false)匹配,否则什么setVisible(true)

希望这会有所帮助。