带有KnockoutJs的Google Maps Marker动画

时间:2017-09-26 01:26:28

标签: javascript jquery google-maps knockout.js

我目前正在使用Google Maps API和KnockoutJS开展地图项目。我已经成功地完成了我的大部分框架,但最后一项功能是躲着我。

当我点击左侧导航栏中的一个预加载位置时,我正试图这样做,它会触发Google地图标记动画,就像点击实际标记一样,以及过滤时清单。

到目前为止,这是我的代码:

    // Define all variables to satisfy strict mode.
var document;
var setTimeout;
var alert;
var ko;
var google;

// Parsing for dynamic background & quote.
function parseQuote(response) {
    "use strict";
    document.getElementById("quote").innerHTML = response.quoteText;
    document.getElementById("author").innerHTML = "Author - <b>" + response.quoteAuthor + "</b>";
}

// Specify all locations on map.
function model() {
    "use strict";
    var locations = [{
        title: "The Hub",
        lat: 39.521975,
        lng: -119.822078,
        id: "The Hub"
    }, {
        title: "The Jungle",
        lat: 39.524982,
        lng: -119.815983,
        id: "The Jungle"
    }, {
        title: "Bibo Coffee Company",
        lat: 39.536966,
        lng: -119.811042,
        id: "Bibo Coffee Company"
    }, {
        title: "Purple Bean",
        lat: 39.531135,
        lng: -119.833802,
        id: "Purple Bean"
    }, {
        title: "Sips Coffee and Tea",
        lat: 39.530438,
        lng: -119.814742,
        id: "Sips Coffee and Tea"
    }];
    return locations;
}

var listLocations = ko.observableArray(model());

// Initalize map location & position.
function initMap() {
    "use strict";
    var map = new google.maps.Map(document.getElementById("map"), {
        center: {
            lat: 39.529633,
            lng: -119.813803
        },
        zoom: 14
    });

// Define markers & content.
    listLocations().forEach(function (data) {

        var positionMk = new google.maps.LatLng(data.lat, data.lng);
        var marker = new google.maps.Marker({
            position: positionMk,
            map: map,
            title: data.title,
            animation: google.maps.Animation.DROP
        });

        var infowindow = new google.maps.InfoWindow({
            content: data.title
        });

        data.mapMarker = marker;

        marker.addListener("click", function () {
            data.triggerMarker(marker);
            listLocations().forEach(function (place) {
                if (data.title === place.title) {
                    place.openInfoWindow();
                } else {
                    place.closeInfoWindow();
                }
            });
        });

        map.addListener("click", function () {
            listLocations().forEach(function (place) {
                place.closeInfoWindow();
            });
        });

        var setMk = function (marker) {
            infowindow.open(map, marker);
            marker.setAnimation(google.maps.Animation.BOUNCE);
            setTimeout(function () {
                marker.setAnimation(null);
            }, 750);
        };
        data.triggerMarker = setMk.bind();

        var openMk = function () {
            infowindow.open(map, marker);
        };
        data.openInfoWindow = openMk.bind();

        var closeMk = function () {
            infowindow.close(map, marker);
        };
        data.closeInfoWindow = closeMk.bind();

    });

}

// Define ViewModel for list and sorting of list.

function ViewModel() {
    "use strict";
    var self = {};

    self.placeList = ko.observableArray([]);

    listLocations().forEach(function (place) {
        place.visible = ko.observable(true);
        self.placeList.push(place);
    });

    self.filterValue = ko.observable("");

    self.filterList = ko.computed(function () {
        listLocations().forEach(function (place) {
            var searchParam = self.filterValue().toLowerCase();
            var toBeSearched = place.title.toLowerCase();

            place.visible(toBeSearched.indexOf(searchParam) > -1);

            if (place.mapMarker) {
                place.mapMarker.setVisible(toBeSearched.indexOf(searchParam) > -1);
            }

            if (place.visible() && searchParam && place.mapMarker) {
                place.triggerMarker(place.mapMarker);
            } else if (place.mapMarker) {
                place.closeInfoWindow();
            }
        });
    });

// Responsiveness for clicking locations on the list.
    self.onClickListener = function (data) {
        listLocations().forEach(function (place) {
            if (data.title === place.title) {
                place.openInfoWindow();
            } else {
                place.closeInfoWindow();
            }
        });
    };

    return self;
}

ko.applyBindings(new ViewModel());

// Error handling for API's.
function forismaticError() {
    "use strict";
    alert("Forismatic API is unreachable, please check your internet connection and try again.");
}

function googleMapsError() {
    "use strict";
    alert("Google Maps API is unreachable, please check your internet connection and try again.");
}

任何能够提供的见解都将受到赞赏!我觉得这很明显,但我疲惫的大脑让我失望。

In addition, here's a quick JSFiddle of the entire project as well.

1 个答案:

答案 0 :(得分:1)

您只需要将触发动画的代码行复制到self.onClickListener函数:

self.onClickListener = function (data) {
                    listLocations().forEach(function (place) {
                        if (data.title === place.title) {
                            place.openInfoWindow();
                            place.triggerMarker(place.mapMarker);
                        } else {
                            place.closeInfoWindow();
                        }
                    });
                };