Рубрики
Без рубрики

Как использовать разрешение в угловых 2 маршрута

Resolve – это мощная техника для достижения наилучшего пользовательского опыта при просмотре между страницами в вашем приложении. Он также делает код контроллера гораздо чистящим в отличие от привлечения данных внутри контроллера.

Автор оригинала: 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

Создать новую папку под названием решает и поставить резольверов с имени шаблона .resolver.ts :

// 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
    }
  }])
);

Но если вы выполните этот код, вы столкнетесь с двумя ошибками:

  1. Генеральный тип «RESOVEL » требует 1 типа аргумента (ы).
  2. TypeError: не может прочитать свойства «Пармы» undefined.

Я не могу объяснить, почему разрешение интерфейса требует любых типов аргументов, но чтобы он работал просто добавить <Любой> Тип аргумента до Решить Отказ

разрешать () Получает 2 аргумента, пока он выполняет, но Это .oute пытается получить свойство этого класса с именем Маршрут , что не правильно. Просто используйте Маршрут Отказ

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