Маршрутный крючок Ember.js должен быть вызван при каждом переходе
Есть ли крючок маршрута в Ember.js, который вызывается при каждом переходе, даже если новый маршрут совпадает с старым маршрутом (например, нажав ссылку навигации верхнего уровня на тот же маршрут).
Я пробовал activate
, но он только вызывается один раз и не вызывается снова, когда я использую навигацию верхнего уровня, чтобы перейти к тому же маршруту, в котором я уже находился.
Пример jsFiddle: Когда я нажимаю "Тест" в первый раз, вызывается activate
hook, но когда я нажимаю его второй раз, это не.
Ответы
Ответ 1
Вы можете настроить didTransition в маршрутизаторе, как это делает Ember для Google Analytics.
App.Router.reopen({
doSomething: function() {
// do something here
return;
}.on('didTransition')
});
Смотрите пример здесь: http://emberjs.com/guides/cookbook/helpers_and_components/adding_google_analytics_tracking/
ОБНОВЛЕНИЕ: (новая ссылка, поскольку старая не работает) https://guides.emberjs.com/v1.10.0/cookbook/helpers_and_components/adding_google_analytics_tracking/
Ответ 2
Activate
не вызывается второй раз, потому что This hook is executed when the router enters the route...
А когда вы нажимаете эту ссылку во второй раз, маршрутизатор ничего не делает... Как и в случае перехода делается (хотя это "попытка").
http://emberjs.com/api/classes/Ember.Route.html#method_activate
Метод, который я нашел, чтобы работать лучше всего, наблюдает currentPath
из контроллера. Я использую это для анимации между маршрутами.
В вашем контроллере приложения вы можете сделать что-то вроде следующего:
currentPathChange: function () {
switch(this.get('currentPath')){
case 'test.index':
this.doSomething();
break;
case 'test.new':
this.doSomethingElse();
break;
}
}.observes('currentPath')
Вы должны иметь возможность получить доступ практически к любой части вашего приложения из контроллера приложения, так что это хороший "корневой хук", я полагаю.
Пример: http://jsfiddle.net/mattblancarte/jxWjh/2/
Ответ 3
Вы уже рассматривали хук willTransition
?
http://emberjs.com/guides/routing/preventing-and-retrying-transitions/
App.SomeRoute = Ember.Route.extend({
actions: {
willTransition: function(transition) {
// do your stuff
}
}
});
Ответ 4
Выполните код Alter/Hack EmberJS и добавьте триггер события jQuery внутри функции doTransition(). Это лучше, но как бы победить точку.
По состоянию на сегодняшний день, через год и Ember 2.0, нет НИКАКИХ ДРУГИХ способов: (
Ember не обеспечивает способ отслеживания попыток изменения маршрута! Это включает URLattemts (история), ссылки на попытки, попытки изменения хэша и т.д.