谷歌地图和knockoutjs

时间:2012-10-04 08:09:35

标签: google-maps google-maps-api-3 knockout.js

我正在创建单页应用,在第二个视图中我需要显示Google地图。我正在使用Google maps API来创建地图对象。

 var map = new google.maps.Map(mapId, {
        zoom: 5,
        center: new google.maps.LatLng(55, 11),
        mapTypeId: google.maps.MapTypeId.ROADMAP
 });

参数mapId给我一个问题。该视图包含一个id为“mapId”的div,但我无法获取id,因此无法显示地图。我尝试过HTML绑定,属性绑定但它不起作用。我是淘汰赛的新手。请提出一些方法

4 个答案:

答案 0 :(得分:20)

你应该像这样使用自定义绑定:

ko.bindingHandlers.map = {

    init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        var mapObj = ko.utils.unwrapObservable(valueAccessor());
        var latLng = new google.maps.LatLng(
            ko.utils.unwrapObservable(mapObj.lat),
            ko.utils.unwrapObservable(mapObj.lng));
        var mapOptions = { center: latLng,
                          zoom: 5, 
                          mapTypeId: google.maps.MapTypeId.ROADMAP};

        mapObj.googleMap = new google.maps.Map(element, mapOptions);
    }
};

您的HTML将如下所示:

<div id="mapDiv" data-bind="style:{width:'300px',height:'300px'},map:myMap"></div>

最后你的视图模型:

function MyViewModel() {
    var self = this;
    self.myMap = ko.observable({
        lat: ko.observable(55),
        lng: ko.observable(11)});
}

这是一个fiddle,它比你要求的要多一些,但也适用于你的情况。

答案 1 :(得分:1)

这是使用Knockout JS和Google Maps的一个很好的例子。希望它能帮助您走上正轨。 http://www.codeproject.com/Articles/387626/BikeInCity-2-KnockoutJS-JQuery-Google-Maps

答案 2 :(得分:1)

我修改了“schmidlop”绑定,以便在输入(lat long输入)的变化时重置标记,并且标记始终位于地图的中心。

HTML

<input data-bind="value: mapOne().lat" />

<input data-bind="value: mapOne().lng" />

绑定,将其包含在某些js文件中并将其包含在html中。

ko.bindingHandlers.map = {
        init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
            $("#" + element.getAttribute("id")).data("mapObj","");
            mapObj = ko.utils.unwrapObservable(valueAccessor());
            var latLng = new google.maps.LatLng(
                ko.utils.unwrapObservable(mapObj.lat),
                ko.utils.unwrapObservable(mapObj.lng));
            var mapOptions = { center: latLng,
                              zoom: 12, 
                              mapTypeId: google.maps.MapTypeId.ROADMAP};

            mapObj.googleMap = new google.maps.Map(element, mapOptions);

            mapObj.marker = new google.maps.Marker({
                map: mapObj.googleMap,
                position: latLng,
               draggable: true
            });     

            mapObj.onChangedCoord = function(newValue) {
                var latLng = new google.maps.LatLng(
                    ko.utils.unwrapObservable(mapObj.lat),
                    ko.utils.unwrapObservable(mapObj.lng));

                mapObj.googleMap.setCenter(latLng);
                mapObj.marker.setPosition(latLng);                 
            };

            mapObj.onMarkerMoved = function(dragEnd) {
                var latLng = mapObj.marker.getPosition();
                mapObj.lat(latLng.lat());
                mapObj.lng(latLng.lng());
            };

            mapObj.lat.subscribe(mapObj.onChangedCoord);
            mapObj.lng.subscribe(mapObj.onChangedCoord);  

            google.maps.event.addListener(mapObj.marker, 'dragend', mapObj.onMarkerMoved);

            $("#" + element.getAttribute("id")).data("mapObj",mapObj);
        }
    };

查看模型

self.mapOne = ko.observable();    


self.mapOne({'lat':ko.observable(87.22),'lng':ko.observable(27.22)});

答案 3 :(得分:0)

而不是mapId您需要使用document.getElementById('map'),其中'map'是包含地图(<div id="map"></div>)的div的ID。 This jsFiddle应该有所帮助。