7

Event オブジェクトの場所に基づいて、埋め込まれた Google マップを表示しようとしています。

これは基本的なアプリです:

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

次のテンプレートを使用します。

<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>

どこでマップを初期化しますか? さらに、緯度/言語が変更された場合、どのようにそれをキャッチしてマップを再描画しますか?

作業ビュー コード(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
});
4

1 に答える 1

6

これは簡単なアイデアです。ember アプリの構造に従っているのではなく、単なるアイデアです。

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

App.Eventまた、次のようにすべきだと思います:

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

Emberのいわゆる染色体突然変異を避けるために

于 2012-09-03T03:05:24.883 に答える