2013-04-20 5 views
5

Buduję aplikację, w której lokalizacja użytkownika została znaleziona za pomocą geolokacji HTML5. Po odzyskaniu lokalizacji ich położenie jest nanoszone na mapie (trasie nadrzędnej). Następnie mogą wyświetlić listę tweetów wysłanych wokół tej lokalizacji (trasa podrzędna).Ember.js: Jak przekazywać dane między kontrolerem macierzystej trasy a trasą podrzędną?

Muszę więc przekazać współrzędne, które pobrałem na trasie macierzystej (które są przechowywane na kontrolerze) do trasy podrzędnej, aby umożliwić prawidłowe odczytanie interfejsu Twitter API. Jednak nie jestem pewien, jak to zrobić, a nawet jeśli wybrałem najlepsze podejście.

Jest to kontroler index:

App.IndexController = Ember.ObjectController.extend({ 

    coords: false, 

    getGeoLocation: function() { 
    if (navigator.geolocation) { 
     this.set('retrieving', true); 
     navigator.geolocation.getCurrentPosition(
      this.locationRetrieved.bind(this), 
      this.locationFailed.bind(this), 
      { 
       timeout: 20000 
      } 
     ); 
    } else { 
     this.set('geolocation', false); 
    } 
    }, 

    locationRetrieved: function(position) { 
    this.set('coords', position.coords); 
    this.get('target').transitionTo('what-do-you-want-to-know'); 
    } 
}); 

Kontroler WhatDoYouWantToKnow "potrzebuje" kontroler indeksu:

App.WhatDoYouWantToKnowController = Ember.ObjectController.extend({ 

    needs: 'index', 

    createMap: function() { 
    var coords = this.get('controllers.index').get('coords'); 
    var pyrmont = new google.maps.LatLng(coords.latitude, coords.longitude); 

    var map = new google.maps.Map(document.getElementById('map'), { 
     mapTypeId: google.maps.MapTypeId.ROADMAP, 
     center: pyrmont, 
     zoom: 8 
    }); 

    var marker = new google.maps.Marker({ 
     map: map, 
     position: pyrmont 
    }); 
    } 
}); 

Trasa ta ma szablon, który łączy się ze „/ what-do-you "droga do wiedzenia/tweety":

<p>Your location:</p> 
<div id="map"></div> 
<ul> 
    <li>{{#linkTo 'tweets'}}Tweets{{/linkTo}}</li> 
</ul> 

Muszę wtedy przekazać te elementy na dziecko Ute:

App.TweetsRoute = Ember.Route.extend({ 
    model: function() { 
    return App.Tweet.find({coords:}); 
    } 
}); 

Używam adaptera Podstawowe Ember dane.

Odpowiedz

5

Łatwo jest to zrobić na trasie. W trasie masz dostęp do wszystkich kontrolerów. Wystarczy użyć metody controllerFor tak:

App.TweetsRoute = Ember.Route.extend({ 
    model: function() { 
     var coords = this.controllerFor('index').get('coords'); 
     return App.Tweet.find({ coords: coords }); 
    } 
}); 
+0

controllerFor jest przestarzała, zamiast tego należy użyć 'potrzeb:„index'' w tweetsController – xamenrax

+0

@Nikita nie mogę znaleźć skąd masz te informacje. Kod nie wydaje się wskazywać, że metoda 'controllerFor' jest nieaktualna. – louiscoquio

+0

Lepiej teraz użyć nowego 'needs controllerName' w kodzie kontrolera. – xamenrax

Powiązane problemy