1

Ember アプリに一連の Google マップ マーカーがあり、これらは JSON フィードからのものであるため、現在イニシャライザーで作成されており、一度だけ読み込む必要があります。

モデル

App.Service = DS.Model.extend({
     title: DS.attr('string'),
     description: DS.attr('string'),
     type: DS.attr('string'),
     lat: DS.attr('string'),
     lng: DS.attr('string'),
     marker: DS.attr('object')
});

初期化子

Ember.Application.initializer({
  name: "preloadServices", 
  initialize: function(container, application) {

    $.getJSON('../services.page',function(data){
      var services = data.services

        $.each(services,function(index,service){

         if(null != service.lat && null != service.lng){    
             var marker = new google.maps.Marker({
                position: new google.maps.LatLng(service.lat,service.lng),
                map: App.googleMap,
                title: service.title,
                icon: 'http://www.google.com/intl/en_us/mapfiles/ms/micons/green-dot.png'
             });

             var mapService = App.Service.createRecord({
                id: service.id,
                name: service.title,
                type: service.type,
                description: service.description,
                lat: service.lat,
                lng: service.lng,
                marker: marker
            });
         }

        google.maps.event.addListener(marker, 'click', function() {
            //Redirect to service?
            mapService.markerClick();
        });

       });

    App.preloadFinished = true;
    $('#loader-bg').fadeOut(600)
   })

  }
});

次にやりたいことは、service.show へのマーカー クリック ルートです。現在、コントローラーまたはビュー以外からルートを呼び出す方法を見つけることができませんでした。誰かがこれを行うためのアイデアや別の方法を持っていますか?

4

1 に答える 1

1

イニシャライザがmodelルートのフック内で実行されると想定しています。そのため、その中で作成されたコールバック内の同じ関数にアクセスできます。このクロージャ内で使用transitionToして、このルーティングを行うことができます。

var route = this;
google.maps.event.addListener(marker, 'click', function() {
  route.transitionTo('service', mapService);
});

編集:明確化を投稿

アプリケーション初期化子内で $.getJSON を実行しています。これは非同期であり、初期化子の目的ではありません。イニシャライザは、IOC コンテナがカスタム オブジェクトを注入するなど、Ember の内部を準備するためのものです。

このイニシャライザ内のコードを のbeforeModelフックに移動しますApp.ApplicationRoutebeforeModelフックは、このような初期化に理想的な場所です。このフックはpromiseso を返すことができます。結果を直接返す必要が$.getJSONあり、ルーターは自動的に一時停止してロードを完了します。

プリローダーの表示には、 を使用しLoadingRouteます。

App.LoadingRoute = Ember.Route.extend({});

と呼ばれるテンプレートloadingを使用して、マークアップを使用します。Ember は、モデルをロードするときにこのテンプレートの表示/非表示を処理します。

<script type="text/x-handlebars" data-template-name="loading">
  <h1>Loading</h1>
</script>

これにより、上記のように使用できるようになりますroute.transitionTo

于 2013-07-25T12:26:34.567 に答える