Событие $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 события не могут быть отменены, только помечены, потому что широковещательная передача может доходить до соседних узлов "одновременно" (или, скорее, в неопределенном порядке).

Другие вопросы по тегам