Задать вопрос
RealBoy2009
@RealBoy2009
Студент

Для чего используются resolver-ы в Angular 2?

Был на собеседовании, вот какая примерно была моя структура приложения:

| app
-| user.component.ts
-| users-list.component.ts
-| posts.component.ts
-| data.service.ts
-| user.resolver.ts
//Проект намного больше, но для понятия моей проблемы, хватит и такой абстрактной структуры.

У меня при клике на юзера, в компоненте users.list, переходит на роут ''/user/:id". для него установлен компонент user, в теле его конструктора, я получаю список юзеров и их портов, примерно так:
constructor (data: data.service ... ) {
    data.subscribe(... this.user = user);
    data.subscribe(... this.postsOfUser = userPosts);
    //Код похож на оригинал, но короче.
}

Так вот, мне на собеседовании сказали, что это плохой подход, лучше использовать resolver-ы, я погуглил, посмотрел и понял, что они нужны, как по-мне, только как прослойка между переходом и компонентом, и просто выборку данных, которую делаю в конструкторе компонента user, я должен был делать в resolver-е, дабы упростить конструктор.

В итоге, они ничего не дают, а только уменьшаю код компонента, через переноса его в resolver?
Вот так я понял зачем они нужны, пожалуйста, укажите, если я не прав, или прав, спасибо!

Вот что делает мой user.resolver.ts
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<User> {
        return this.rest.getUser(route.params['id']);
    }

Далее идёт подгрузка компонента(user.component.ts) при роуте:
export class UserPostsComponent {
    user: User;

    constructor(private router: ActivatedRoute, private rest: RestService) {
        this.user = router.snapshot.data['user'];
        
        rest.getAllPosts(router.snapshot.params['id']);
    }
}

Т.е, я только получаю пользователя через resolver, и всё, а посты в компоненте юзера. Если же хочу и посты тоже в resolver-е получать, то нужно и под него отдельный файл...

Пожалуйста, помогите понять, я верно мыслю?
  • Вопрос задан
  • 9018 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
Вообще говоря нужно быть аккуратным с резолверами.
Вот мы сначала пихали всё в resolverы, а потом обратно из них убирали часть нектритичного контента, т.к. показ страницы уж очень надолго оттягивался. В резолверах стоит оставлять только то, без чего нельзя показывать view. А ещё резолверы можно использовать для проверки доступа или каких-то других вещей. Ведь если в resolver попадет reject - перехода не произойдет.
Ответ написан
DarthJS
@DarthJS
Resolve используется в случаях, когда тебе нужно дождаться данные, которые передаются тебе с задержкой (асинхронные). Например в Angular 1, когда тебе приходит promise, тебе нужно его разрезолвить (часто помагает перевод слова/параметра, njulf становится яснее, что оно делает), а потом инджектить в контроллер. То есть вьюшка дожидается, когда в роуте произойдёт подготовка данных, а уже потом отображает.
Такая же ситуация и в Angular 2, только еще появились Observable, помимо Promise.
Ответ написан
Комментировать
PML
@PML
Web-developer
Как и писали выше. Resolve позволяет получить данные до момента загрузки компонента роутом. Т.к. получение данных с сервера могут быть долгими и что бы пользователь не смотрел в белый экран, ипользуется resolve, который получает получает данные до момента, когда у тебя сработал роутинг.
Вот хорошо тут описано почему и для чего: https://bxnotes.ru/conspect/angular-5-the-complete...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы