2012-10-04 23 views
7

मैं एक पृष्ठ ऐप बना रहा हूं जहां दूसरे दृश्य में मुझे Google मानचित्र प्रदर्शित करने की आवश्यकता है। मैं Google मानचित्र API का उपयोग कर रहा हूं जहां नक्शा ऑब्जेक्ट बनाया जाना है।Google मानचित्र और knockoutjs

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

पैरामीटर mapId मुझे एक समस्या दे रहा है। दृश्य में आईडी के साथ एक div शामिल है "mapId", लेकिन मैं आईडी प्राप्त करने में सक्षम नहीं हूं और इसलिए नक्शा प्रदर्शित नहीं किया जा सकता है। मैंने एचटीएमएल बाइंडिंग की कोशिश की, विशेषता बाध्यकारी लेकिन यह काम नहीं करता है। मैं नॉकआउट के लिए नया हूँ। कृपया कुछ विधि

+1

तुम क्यों आप तत्व की आईडी नहीं मिल सकता है के बारे में और अधिक विशिष्ट हो सकता है? क्या दूसरा दृश्य एक मोडल/संवाद है? –

+0

दूसरा दृश्य एक मॉडल है। और पीएस- मैं knockout.js का उपयोग कर रहा हूँ। आईडी तक पहुंचने के लिए, मैं jquery वाक्यविन्यास $ ('# mapId') [0] वाक्यविन्यास का उपयोग कर रहा हूं, यह शून्य या अपरिभाषित लौटाता है। जब मैं आईडी के लिए बाध्यकारी एट्रिब्यूट का उपयोग करता हूं, तो मान आईडी को सौंपा जाता है, लेकिन यह एक div तत्व (जो नक्शा ऑब्जेक्ट के लिए आवश्यक है) का प्रतिनिधित्व नहीं करता है, लेकिन केवल एक स्ट्रिंग जो आईडी मान के बराबर है। – Empty

+0

क्या आप jsfiddle पर या अपने प्रश्न में कुछ कोड पोस्ट कर सकते हैं? मैं सोच रहा हूं कि क्या आप Google मानचित्र ऑब्जेक्ट को प्रारंभ कर रहे हैं * पहले * नॉकआउट में आपके तत्व को आईडी को बांधने का मौका है। –

उत्तर

0

के बजाय mapId आप document.getElementById('map'), जहां 'map' का उपयोग करना चाहेंगे नक्शा (<div id="map"></div>) युक्त div की आईडी है। This jsFiddle मदद चाहिए।

19

आप एक कस्टम इतनी तरह बाध्यकारी उपयोग करना चाहिए:

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

फिर आप एक ही मानचित्र में और अधिक अंक कैसे दबाते हैं? मैंने अवलोकन करने की कोशिश की ऐरे लेकिन यह काम नहीं कर सकता है कोई भी उस पर मेरी मदद कर सकता है? –

+0

@kougiland - बाध्यकारी में मैंने दृश्य मॉडल की googleMap संपत्ति (उदाहरण में 'myMap') में Google मानचित्र ऑब्जेक्ट पर एक प्रतिबिंब छीन लिया है। आप इसे self.myMap()। GoogleMap जैसे एक्सेस कर सकते हैं और मार्कर सीधे जोड़ सकते हैं। यदि आप बाध्यकारी चाहते हैं जो मैप मार्कर को एक अवलोकन सरणी के साथ सिंक में रखता है तो आपको एक अलग प्रश्न पूछना चाहिए। – schmidlop

3

मैंने "schmidlop" बाध्यकारी को इनपुट में परिवर्तन (लेट लम्बा इनपुट) और मार्कर के केंद्र में हमेशा मार्कर रीसेट करने के लिए बाध्यकारी में संशोधन किया है।

एचटीएमएल

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