Событие $rootScope предотвращает последующий обработчик предотвратительный запуск
Я использую ui-router и зарегистрировал два обработчика $stateChangeStart для перенаправления страницы входа.
function func1(e,to,toParams, from, fromParams){
....
if (notAuthenticated) {
e.preventDefault();
$state.go('login');
}
}
function func2(e,to,toParams, from, fromParams){
...
console.log('func2', from, to, e.defaultPrevented);
}
$rootScope.on('$stateChangeStart', func1);
$rootScope.on('$stateChangeStart', func2);
Так как func1 предотвращает дефолт (), я вижу, что в func2 e.defaultPrevented имеет значение true. Я просто не понимаю, почему предотвращение default в func1 не останавливает выполнение func2. Это поведение по замыслу? И если это так, что означает "по умолчанию"?
Вот этот план: http://plnkr.co/edit/o81NVo?p=preview Вы можете очистить консоль и повторно запустить ее, чтобы увидеть журнал.
1 ответ
Вы близки к ответу - поскольку нет встроенного события "по умолчанию" для предотвращения, preventDefault
только устанавливает defaultPrevented
логическое значение; Вы должны проверить это логическое значение в func2 и выручить, если это правда. (Может быть любое количество функций, отслеживающих stateChangeStart
; У angular нет прямого способа узнать, что func2 - это то, что вы намереваетесь использовать по умолчанию.)
(Если оригинальное событие было $emit
Эд, вы могли бы использовать stopPropagation
чтобы он не пузырился дальше вверх по DOM; это возможно потому что $emit
Идут в определенном порядке, каждый узел имеет только одного родителя. $broadcast
события не могут быть отменены, только помечены, потому что широковещательная передача может доходить до соседних узлов "одновременно" (или, скорее, в неопределенном порядке).