2016-08-10 5 views
3

CanActivate class разрешает возврат типа Observable<boolean>.Почему CanActivate с угловым 2 возвращает Observable <boolean> вместо обещания?

Единственные случаи использования, которые имеют смысл для меня являются:

  1. CanActivate может «асинхронно» блокировать маршрут отображается до тех пор, пока observer.next(true|false) называется.
  2. Я мог отобразить маршрут, который CanActivate позволяет затем нажать observer.next(false) из другой части моего приложения и исчезнет этот маршрут.

Однако, пункт один работает, но не второй. Поэтому я не могу найти причину, по которой CanActivate должен допускать возврат типа Observable<boolean>, кроме удобства, что, в свою очередь, усложняет API. Было бы более чистым, если бы CanActivate разрешал только boolean тип возврата и Promise.

Обратите внимание, что я новичок в Angular, RxJS и обо всем, на чем основано Node, поэтому мне может быть недостает очевидного. Я потратил некоторое время, пытаясь извлечь функциональность от CanActivate, что подразумевает тип возврата Observer<boolean>.

+0

Это их решение не использовать обещания, заменяя их Observables. У вас наверняка есть Observable, который просто возвращает одно значение до завершения, все вызовы http теперь обещают, например. –

+0

Почему бы не спросить разработчиков, которые построили маршрутизатор, на котором базировался маршрутизатор v3? [Создать вопрос] (https://github.com/ngrx/router/issues), задайте вопрос, и вы, скорее всего, получите ответ. – cartant

+0

Хорошо. Не был уверен, был ли это глупый вопрос. – Dan

ответ

0

В AngularJS 2 почти каждая асинхронная операция возвращается Observable. Поскольку вы можете реализовать собственный CanActivate, вы можете сделать это с помощью доступа к серверу. Например, проверка учетных данных администратора на сервере. Вы можете увидеть аналогичный пример here.

Если этот метод вернул тип данных типа boolean, вам нужно будет заблокировать страницу для этого.

0

Это позволяет вам выполнить какой-либо процесс асинхронной работы. Представьте, что вы имеете currentUser, наблюдаемый из службы проверки подлинности. Это ReplaySubscriber(1); и всегда будет возвращать текущего зарегистрированного пользователя, но когда ваше приложение загружает первый вызов, вызов по-прежнему может обрабатываться, поэтому вы не знаете, завершено ли оно.

CanActivate() { 
    return this.currentUser.map(user => user && user.isActive()); 
} 
+0

Использование «Observable» подразумевает, что я также получаю функциональность, как я описал в первой части моего вопроса, поскольку они предназначены для нажатия [нескольких значений] (http://reactivex.io/rxjs/manual/overview.html#observable) , «CanActivate» имеет возможность только нажать * одно значение, прежде чем он отменит подписку на наблюдаемый. Поэтому, безусловно, более подходящим является тип возврата 'Promise'. Я уточню свой вопрос с большей ясностью. – Dan

+0

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

+0

Да, это функциональность, которую я вижу, поэтому я думаю, что возвращение обещания было бы более уместным. – Dan

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