2015-10-12 4 views
2

Я использую 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 preventDefault(), я могу видеть, что в func2 e.defaultPrevented верно. Я просто не понимаю, почему предотвращение дефолта в func1 не прекращает выполнение func2. Это поведение по дизайну? И если это так, что означает «дефолт»?

Вот плунж: http://plnkr.co/edit/o81NVo?p=preview Вы можете очистить консоль и повторно запустить ее, чтобы увидеть журнал.

ответ

1

Вы близки к ответу - поскольку для предотвращения не существует встроенного события по умолчанию, preventDefault устанавливает только defaultPrevented boolean; вам нужно проверить, что boolean в func2, и выпустить, если это правда. (Может быть любое количество функций, наблюдающих за stateChangeStart, у углового нет никакого прямого способа узнать, что func2 - это то, что вы намерены использовать по умолчанию.)

(Если оригинальное событие было $emit ed, вы можете использовать stopPropagation, чтобы предотвратить его пузырение дальше DOM, это возможно, потому что $emit s идут в определенном порядке, каждый узел имеет только один родитель. События $broadcast не могут быть отменены, только отмечены флажками, поскольку широковещательная передача может достигать (или, более вероятно, в неопределенном порядке.)

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