2014-01-31 3 views
29

в Ember.js У меня есть маршрут с моделью. Не могли бы вы мне помочь, когда я нахожусь в плейлисте маршрута, как перезагрузить этот маршрут (или установить новые данные в модель), вызванный обратным вызовом из другой функции JS? Я долго искал документацию, но не помогал мне.Как перезагрузить текущий маршрут в Ember.js?

App.PlaylistRoute = Ember.Route.extend({ 
setupController: function(controller, model) { 
    $.getJSON('api/playlist.php?' + Math.random().toString(36), function (data) { 
    controller.set('model', data); 
    }); 
} 
}); 

Большое спасибо!

ответ

7

С использованием контроллера transitionToRoute:

this.transitionToRoute('playlist', newModel); 

от использования данных маршрута transitionTo:

this.transitionTo('playlist', newModel); 

Например, представьте, у вас есть действие на контроллере

App.PlaylistController = Ember.ArrayController.extend({ 
actions: { 
    grabNewModel: function(){ 
    //get some new model 
    this.transitionToRoute('playlist', newModel); 
    } 
} 
}); 
+1

Ember.Controller.transitionToRoute, похоже, не перезагружает текущий маршрут. У меня есть LOG_TRANSITIONS_INTERNAL, и все это делает «Попытка перехода к индексу» и заканчивается. Теперь переход в код перехода ToRoute ... –

+0

Вам нужно отправить другую модель, если вы отправляете текущую модель, тогда нет законной причины перезагрузки маршрута. Что вы пытаетесь достичь? – Kingpin2k

+0

Вариант использования. Когда вы определяете свою модель в маршруте «/ foos» в качестве списка (например, с помощью 'findQuery' из ember-data), создайте модель того же класса в другом маршруте«/foos/new », а затем перенаправите обратно на «/ foos», используя «Route # transitionTo», вновь созданная модель не появится, потому что ни 'model()' hook, ни 'setupController()' не эксплицируются на "/ foo". Такое поведение наблюдается при использовании маршрута с динамическими сегментами и при запуске 'transitionTo 'foo', 23'. Итак, как мы заставляем маршрут «/ foo» перезагружать его 'model()'? –

64

кажется решение в ответе не будет работать для текущего маршрута. У меня была такая же проблема, и я попробовал решение здесь, и это сработало.

http://discuss.emberjs.com/t/refresh-current-view-page-after-language-change/4291/5#post_5

В вашем маршруте.

actions: { 
    sessionChanged: function() { 
    this.refresh(); 
    } 
} 

и в вашем контроллере.

observeSession: function() { 
    this.send("sessionChanged"); 
}.observes("session.isAuthenticated"), 
+0

Это должен быть принятый ответ. – KOGI

+4

К сожалению, я пробовал это, и ничего не происходит. Я не использую какую-либо модель на маршруте, мне просто нужно ее перерегистрацию; но ничего не работает. –

+0

Та же самая идея все в файле маршрута:. '' ' afterModel() { this.get ('сессии') на ('sessionAuthenticated',() => { this.refresh();} ); } '' ' – huntie

6

Есть два способа сделать это.

Один из них написал действие в списке плейлистов и позвонил this.refresh() внутри него . Для получения дополнительной информации вы можете найти метод Ember Guide refresh метод маршрута.

Другой способ заключается в контроллере в зависимости от ситуации, когда вам нужно перезагрузить ваш маршрут использовать

this.get('target.target.router').refresh(); 

любой из двух поможет вам в освежать свой маршрут.

Небольшое примечание методы обновления ниже от Ember руководств:

Обновить модель на этом маршруте и все дочерние маршруты, обжиг beforeModel, модель, и крючки afterModel аналогичным образом тому, как вводятся маршруты при переходе с другого маршрута. Текущие параметры маршрута (например, article_id) будут переданы соответствующим крючкам модели, а если будет возвращена другая модель, то снова запустится настройка ControlController и связанные с ней маршруты.

+2

Для меня это было 'this.get ('target.router'). Refresh()'. Кроме того, вызов 'refresh' на маршруте, кажется, освежает как родительский, так и дочерний маршруты обновляемого маршрута (так что обновление все время расширяется до маршрута приложения). – Sarus

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