2013-09-29 2 views
7

У меня есть вопрос относительно системы маршрутизации Ember.Изменение URL без перехода

В моем Ember-приложении у меня есть простенькая брошюра в полноэкранном режиме. Уровень центра и масштабирования этой карты исходит из параметров URL-запроса. Теперь было бы неплохо иметь простой способ сохранить эти параметры запроса в синхронизации с позицией карты. Поэтому, когда кто-то перемещает карту, я хотел бы изменить параметры запроса url на новые значения.

Когда я использую простой transitionTo, я начинаю цикл изменения карты и обновления параметров запроса, изменяя карту снова и так далее.

Итак, моя первая идея состояла в том, чтобы получить реализацию местоположения от маршрутизатора и вручную изменить URL-адрес. Но я не знаю, как это сделать. И это также не оправдывает использование Ember таким образом.

+0

Нельзя вручную обновлять URL-адрес с помощью объекта местоположения или что-то в этом роде. Способ воздействия на внешний вид в Ember заключается в использовании маршрутов и добавлении к ним динамических сегментов. – mavilein

+0

Посмотрите на следующие ссылки: http: // stackoverflow.com/questions/15165072/is-resource-nesting-the-only-way-to-enable-multiple-dynamic-segment/15174766 # 15174766 http://mavilein.github.io/javascript/2013/09/28/ 3-step-to-ember-js-seo-friendly-urls/ – mavilein

+0

И этот -> http://stackoverflow.com/questions/18164461/how-do-you-maintain-the-page-state-so- что-вы-можете-обеспечить-permalinks-using-emb/18249404 # 18249404 Эти ссылки содержат все необходимые ингредиенты. Если у вас есть проблемы, создайте JSFiddle или JSBin, и я могу помочь вам разработать базовый пример. – mavilein

ответ

7

После многих downvotes мой ответ выше, в Ember вы также можете сделать это так, вы не идете через переход или перегрузки данных/рендеринга

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

или для устаревших браузеров получить доступ к хэш:

Ember.run(function(){ 
    location.hash = 'foo'; 
}); 
+0

'window.history.replaceState ({}, 'foo', '/ foo');' отлично работал для меня – mihai

3

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

Определено в пакетах/Ember-маршрутизации/Lib/местоположение/history_location.js: 134

Я не проверял это, но:

Ember.HistoryLocation.replaceState(<string>); 

должен работать.

Кроме того, мой коллега рекомендует использовать маршрутизатор для достижения этой цели:

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

router.replaceWith('index'); 
+0

Звучит многообещающе. У вас есть идея, как получить доступ к местоположению? Может быть, через действия на маршруте? Я очень новичок в Ember и искал какую-то лучшую практику. – Johnny

+0

Да, я ошибся в моем обновлении кода. Я теперь исправил его, и, как вы сказали, используется 'router.replaceWith ('index')' для изменения URL-адреса. Спасибо! – Johnny

+0

Замена маршрута, похоже, не работает для меня, когда новый маршрут такой же, как старый маршрут. Это нормально или я что-то упускаю? – elsurudo

2

Чтобы добавить в предыдущие ответы, используя прямой подход к изменению URL-адреса, когда вы хотите изменить URL-адрес, в текущих версиях Ember существует возможность связывания параметров запроса с свойствами контроллера.

Простой пример компилируется из 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') 
}); 

При использовании запроса Params Таким образом, контроллер/просмотр кода может просто изменить связанные свойства контроллера и параметры запроса будут обновляться автоматически.

Используйте Ember.Route queryParams property, чтобы изменить способ параметров запроса эффект события маршрута следующим образом:

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

Это покажет Ember, чтобы перезагрузить необходимые части с сервера при наклоне карты, но не при изменении масштаба. Кроме того, изменение параметров не будет перемещать элементы состояния в историю браузера.

Смежные вопросы