2012-09-03 4 views
7

J'essaie d'afficher une carte Google intégrée en fonction de l'emplacement d'un objet événement.Ember.js avec Google Map en vue

Ceci est l'application de base:

App = Em.Application.create(); 

App.Event = Em.Object.extend({ 
    lat: -33.8665433, 
    lng: 151.1956316 
}); 

App.EventController = Ember.ObjectController.extend(); 

App.ApplicationController = Ember.ObjectController.extend(); 

App.EventView = Ember.View.extend({ 
    templateName: 'event' 
}); 

App.ApplicationView = Ember.View.extend({ 
    templateName: 'application' 
}); 

App.Router = Ember.Router.extend({ 
    enableLogging: true, 
    root: Ember.Route.extend({ 
     event: Ember.Route.extend({ 
      route: '/', 
      connectOutlets: function (router) { 
       router.get('eventController').set('content', App.Event.create()); 
       router.get('applicationController').connectOutlet('event'); 
      } 
     }) 
    }) 
}); 

App.initialize(); 

Avec les modèles suivants:

<script type="text/x-handlebars" data-template-name="application"> 
    {{outlet}} 
</script> 
<script type="text/x-handlebars" data-template-name="event"> 
    {{lat}} {{lng}} 
    // Embeded Google Map 
</script> 

Où puis-je initialiser la carte? De plus, si le changement lat/lang, comment l'attraper et redessiner la carte?

travail Afficher le code (modification de la réponse de sabithpocker)

App.EventView = Ember.View.extend({ 
    templateName: 'event', 
    map: null, 
    latitudeBinding: 'controller.content.lat', 
    longitudeBinding: 'controller.content.lng', 
    didInsertElement: function() { 
     var mapOptions = { 
      center: new google.maps.LatLng(this.get('latitude'), this.get('longitude')), 
      zoom: 8, 
      mapTypeId: google.maps.MapTypeId.ROADMAP 
     }; 
     var map = new google.maps.Map(this.$().get(0), mapOptions); 
     this.set('map', map); //save for future updations 
     this.$().css({ width: "400px", height: "400px" }); 
    }, 
    reRenderMap: function() { 
     if (this.get('map')) { 
      var newLoc = new google.maps.LatLng(this.get('latitude'), this.get('longitude')); 
      this.get('map').setCenter(newLoc); 
     } 
    }.observes('latitude', 'longitude') //these are bound to lat/lng of Event 
}); 

Répondre

6

Voici une idée rapide, ne suit pas la structure de l'application de Ember, juste une idée.

App.EventView = Ember.View.extend({ 
    templateName: 'event', 
    map : null, 
    latitudeBinding : 'App.Event.lat', 
    longitudeBinding : 'App.Evet.lng', 
    didInsertElement : function(){ 
     var mapOptions = { 
     center: new google.maps.LatLng(this.get('latitude'), this.get('longitude')), 
     zoom: 8, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
     }; 
     var map = new google.maps.Map(this.$().get(0),mapOptions); 
     this.set('map',map); //save for future updations 
    }, 
    reRenderMap : function(){ 
     var newLoc = new google.maps.LatLng(this.get('latitude'), this.get('longitude')); 
     this.get('map').setCenter(newLoc) 
     }.observes('latitude','longitude') //these are bound to lat/lng of Event 
}); 

Je pense aussi App.Event devrait être:

App.Event = Em.Object.extend({ 
    lat: null, 
    lng: null, 
    init : function(){ 
     this.set('lat', -33.8665433); 
     this.set('lng', 151.1956316); 
     } 
}); 

pour éviter le soi-disant chromosomal mutation in Ember

+0

Merci beaucoup! J'ai mis à jour la question avec le code de vue final (seule la vraie différence est que je lie à la propriété content de l'eventController). –

+0

Heureux que cela a aidé :) – sabithpocker