2012-10-04 50 views
7

Tôi đang tạo một ứng dụng trang duy nhất ở chế độ xem thứ hai mà tôi cần để hiển thị bản đồ Google. Tôi đang sử dụng API bản đồ của Google, nơi đối tượng bản đồ sẽ được tạo.Google maps and knockoutjs

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

Thông số mapId đang gây ra sự cố. Khung nhìn chứa một div có id nói "mapId", nhưng tôi không thể nhận được id và vì vậy bản đồ không thể được hiển thị. Tôi đã thử ràng buộc HTML, ràng buộc thuộc tính nhưng nó không hoạt động. Tôi mới để loại trực tiếp. Vui lòng đề xuất một số phương pháp

+1

bạn có thể cụ thể hơn về lý do tại sao bạn không thể nhận được id của nguyên tố này? Chế độ xem thứ hai là một phương thức/hộp thoại? –

+0

chế độ xem thứ hai là phương thức. và PS- Tôi đang sử dụng knockout.js. Để truy cập id, tôi đang sử dụng cú pháp jquery $ ('# mapId') [0], nó trả về null hoặc undefined. Khi tôi sử dụng liên kết atrribute cho id, giá trị được gán cho id, nhưng nó không đại diện cho phần tử div (được yêu cầu cho đối tượng bản đồ) nhưng chỉ có một chuỗi bằng giá trị id. – Empty

+0

Bạn có thể đăng một số mã trên jsfiddle hoặc trong câu hỏi của bạn không? Tôi đang nghĩ nếu bạn đang khởi tạo đối tượng bản đồ google * trước * Knockout có cơ hội gắn kết ID với phần tử của bạn. –

Trả lời

0

Thay vì mapId bạn sẽ muốn sử dụng document.getElementById('map'), nơi 'map' là id của div chứa bản đồ (<div id="map"></div>). This jsFiddle sẽ giúp ích.

19

Bạn nên sử dụng ràng buộc như vậy một tùy chỉnh:

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 của bạn sẽ trông như thế này:

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

Cuối cùng mô hình xem của bạn:

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

Đây là một fiddle điều đó có nhiều hơn một chút so với những gì bạn đang yêu cầu nhưng cũng nên làm việc tốt cho trường hợp của bạn.

+1

làm cách nào để bạn đẩy thêm điểm vào một bản đồ? tôi đã thử observableArray nhưng nó doesn 'làm việc bất cứ ai có thể giúp tôi về điều đó? –

+0

@kougiland - trong ràng buộc tôi đã stashed một sự tôn trọng đối tượng bản đồ google trong thuộc tính googleMap của mô hình xem ('myMap' trong ví dụ). Bạn có thể truy cập nó như self.myMap(). GoogleMap và thêm đánh dấu trực tiếp. Nếu bạn muốn một ràng buộc giữ cho các điểm đánh dấu bản đồ đồng bộ với một mảng quan sát được thì bạn nên hỏi một câu hỏi khác. – schmidlop

3

Tôi đã sửa đổi liên kết "schmidlop" để đặt lại điểm đánh dấu về thay đổi đầu vào (đầu vào dài lat) và điểm đánh dấu luôn ở giữa bản đồ.

Html

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

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

Binding, Bao gồm này trong một số tập tin js và bao gồm nó trong 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); 
     } 
    }; 

Xem Mẫu

self.mapOne = ko.observable();  


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