2017-12-18 4 views
-1

私は運が悪いのでこの問題を解決しようとしてきました。私はすでに他の投稿と運がないかチェックします。私は私のコードに誤りがあると思う、私の目標はリストをフィルタリングし、そのリストのマーカーだけを表示/非表示にすることである。コードのサンプルはここにある:ここでhttps://jsfiddle.net/rp2t3gyn/2/ノックアウトでGoogleのマーカーをフィルターにかける

は、何らかの理由で動作しないコードのサンプルです:

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); 

おかげ

+0

エラーが 'placeItem' – adiga

+0

には' marker'プロパティが存在しないため、どのように私はあなたのフィドルはJavaScriptエラーがあり –

+0

「placeItem」にこれらのプロパティを与えることができますスローされます。 ' Uncaught TypeError:未定義のプロパティ 'maps'を読み取れません – geocodezip

答えて

0

あなたがする必要があるマーカーをフィルタリングするためには、いくつかのこと。

あなたの最初の問題は、この行です:

placeItem.marker.setVisible(true); 

場所項目は、あなたのコンストラクタに基づいてマーカーオブジェクトを持っていません。それで、あなたはそれを追加しなければなりません。私はPlaceコンストラクタを変更してマーカーオブジェクトを追加しました(下記参照)。

var Place = function(data, map, viewmodel) { 
this.city = data.city; 
this.lat = data.lat; 
this.lng = data.lng; 
var marker = new google.maps.Marker({ 
    map: map, 
    position: {lat: data.lat, lng: data.lng}, 
    city: data.city, 
    icon: { 
     path: google.maps.SymbolPath.BACKWARD_CLOSED_ARROW, 
     scale: 5 
     }, 
    animation: google.maps.Animation.DROP, 
}); 
marker.addListener('click', function() { 
    viewmodel.clickSelection(marker, viewmodel.largeInfoWindow); 
}); 
this.marker = 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); 
      }); 
     } 
    }); 

​​

関連する問題