Автор оригинала: Max Diachenko.
Resolve – это мощная техника для достижения наилучшего пользовательского опыта при просмотре между страницами в вашем приложении. Он также делает код контроллера гораздо чистящим в отличие от привлечения данных внутри контроллера.
Только один совет: Не злоупотребляйте рену
Нагрузка только в важных данных в решаются, чтобы немедленно отобратьте основные части страницы и получать все остальные данные, асинхронно.
Angular1 против Angular2.
В Angular1 мы могли видеть следующий код для определения релантов в маршрутизаторе (UI-маршрутизатор):
$stateProvider .state('transactions.details', { url: '/transactions/:id', views: { content: { controller: 'TransactionCtrl', templateUrl: 'transaction.html', resolve: { transactions: function (Transaction, $stateParams) { return Transaction.getById($stateParams.id); } } } } })
В Angular 2.0.0-RC.4 Маршрутизатор вы можете сделать подобные вещи, но с некоторыми ключевыми отличиями:
// main.ts import { TransactionResolver } from './resolvers/transaction.resolver.ts'; export const routes: RouterConfig = [ { path: 'transactions/:id', component: TransactionComponent, resolve: { transaction: TransactionResolver } } ]; bootstrap(AppComponent, [ provideRouter(routes) ])
Как видите, это в значительной степени то же самое, за исключением того, что мы проходим ТранзакцииРезолвер
класс вместо функции.
Как реализовать Resolver Class
Создать новую папку под названием решает
и поставить резольверов с имени шаблона
:
// transaction.resolver.ts import { Injectable } from '@angular/core'; import { Resolve, ActivatedRouteSnapshot } from '@angular/router'; import { Observable } from 'rxjs/Rx'; import { TransactionService } from '../services/transaction.service'; @Injectable() export class TransactionResolver implements Resolve{ constructor( private transactionService: TransactionService ) {} resolve(route: ActivatedRouteSnapshot): Observable { return this.transactionService.getById(route.params.id); } }
- Экспортируемый класс должен быть инъекционным
- Класс должен навещать
Разрешить <любой>
Интерфейс с одним методомРешить (): наблюдаемый <любой>
Почему этот пример отличается от докторов угловых 1?
В угловых 2 документах в Решить мы можем видеть:
class TeamResolver implements Resolve { constructor(private backend: Backend) {} resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable{ return this.backend.fetchTeam(this.route.params.id); } } bootstrap(AppComponent, [ TeamResolver, provideRouter([{ path: 'team/:id', component: TeamCmp, resolve: { team: TeamResolver } }]) );
Но если вы выполните этот код, вы столкнетесь с двумя ошибками:
- Генеральный тип «RESOVEL
» требует 1 типа аргумента (ы). - TypeError: не может прочитать свойства «Пармы» undefined.
Я не могу объяснить, почему разрешение интерфейса требует любых типов аргументов, но чтобы он работал просто добавить <Любой>
Тип аргумента до Решить
Отказ
разрешать ()
Получает 2 аргумента, пока он выполняет, но Это .oute
пытается получить свойство этого класса с именем Маршрут
, что не правильно. Просто используйте Маршрут
Отказ
Тем не менее, я не знаю, почему документация не является неспособной и неинформированной. Я провел часы, чтобы сделать резолюцию работать в угловых 2, поэтому надеюсь, что эта статья поможет кому-то.