2013-09-29 18 views
7

Ho una domanda riguardante il sistema di routing Ember.Modifica URL senza transizione

Nella mia App Ember, ho una semplice mappa a tutto schermo. Il centro e il livello di zoom di questa mappa provengono dai parametri di query URL. Ora sarebbe bello avere un modo semplice per mantenere i parametri di questa query in sincronia con la posizione della mappa. Quindi, quando qualcuno muove la mappa, vorrei cambiare i parametri della query url con i nuovi valori.

Quando utilizzo un semplice transitionTo, avvio un ciclo per modificare la mappa e aggiornare i parametri della query cambiando nuovamente la mappa e così via.

Quindi la mia prima idea era quella di ottenere l'implementazione della posizione dal router e modificare l'url manualmente. Ma non so come farlo. E fa anche i torti sbagliati usando Ember in questo modo.

+0

Non è necessario aggiornare l'URL manualmente con l'oggetto posizione o qualcosa del genere. Il modo per influenzare l'aspetto in Ember è l'uso di percorsi e aggiungere segmenti dinamici a loro. – mavilein

+0

Dai un'occhiata ai seguenti link: http: // stackoverflow.it/questions/15165072/is-resource-nesting-the-only-way-to-enable-multi-dynamic-segments/15174766 # 15174766 http://mavilein.github.io/javascript/2013/09/28/ three-steps-to-ember-js-seo-friendly-urls/ – mavilein

+0

E questo -> http://stackoverflow.com/questions/18164461/how-do-you-maintain-the-page-state-so- that-you-can-provide-permalinks-using-emb/18249404 # 18249404 Questi collegamenti contengono tutti gli ingredienti necessari. Se hai problemi, crea un JSFiddle o JSBin e io posso aiutarti a trovare un esempio di base. – mavilein

risposta

7

Dopo molti downvotes per la mia risposta sopra, in Ember si potrebbe anche fare questo in modo da non passare attraverso un transizione o ricaricare i dati/rendering

Ember.run(function(){ 
    window.history.replaceState({} , 'foo', '/foo'); 
}); 

o per i browser legacy accedere alla hash:

+0

'window.history.replaceState ({}, 'foo', '/ foo');' ha funzionato bene per me – mihai

3

http://emberjs.com/api/classes/Ember.HistoryLocation.html#method_replaceState

Definito nei pacchetti/brace-instradamento/lib/posizione/history_location.js: 134

non ho ancora testato questo, ma:

Ember.HistoryLocation.replaceState(<string>); 

dovrebbe funzionare.

anche il mio collega consiglia di utilizzare il router per raggiungere questo obiettivo:

http://emberjs.com/blog/2013/02/15/ember-1-0-rc.html#stq=&stp=0

router.replaceWith('index'); 
+0

Sembra promettente. Hai un'idea di come accedere alla posizione? Forse tramite azioni nel percorso? Sono molto nuovo con Ember e sto cercando qualche tipo di best practice. – Johnny

+0

Sì, ho fatto un errore nel mio codice che ricarica la mappa. Ora l'ho corretto e come hai detto usava 'router.replaceWith ('index')' per cambiare l'url. Grazie! – Johnny

+0

La sostituzione del percorso non sembra funzionare per me quando il nuovo percorso è uguale al vecchio percorso. È normale o mi manca qualcosa? – elsurudo

2

Per aggiungere risposte precedenti, utilizzare l'approccio semplice di modifica dell'URL quando si desidera modificare l'URL, nelle versioni correnti di Ember esiste un'opzione di collegamento dei parametri di query alle proprietà del controller.

Un semplice esempio compilato dal Ember guide page:

App.MapController = Ember.ObjectController.extend({ 
    queryParams: ['zoom', {latitude: 'lat'}, {longitude: 'lon'}], 

    zoom: 10, 
    latitude: null, 
    longitude: null, 

    mapWindowChanged: function { 
    MapApi.reposition(this.zoom, this.latitude, this.longitude); 
    }.observes('zoom','latitude','longitude') 
}); 

Quando si utilizza interrogazione params questo modo, il codice del controller/vista può semplicemente modificare le proprietà del controller legati e parametri di query aggiornerà automaticamente.

Utilizzare il Ember.Route queryParams property per cambiare l'effetto parametri di query eventi di percorso andata come segue:

App.MapRoute = Ember.Route.extend({ 
    queryParams: { 
    lat: { 
     refreshModel: true, 
     replace: true, 
    }, 
    long: { 
     refreshModel: true, 
     replace: true, 
    }, 
    zoom: { 
     replace: true 
    } 
    } 
}); 

Questo dirà Ember di ricaricare parti necessarie dal server quando inclinando la mappa, ma non quando si cambia lo zoom. Inoltre, la modifica dei parametri non sposterà gli elementi dello stato nella cronologia del browser.

Problemi correlati