Как обновить разрешенные данные маршрута

Рассмотрим следующую конфигурацию маршрута:

const routes: Routes = [
  {
    path: '',
    component: AppComponent,
    resolve: {
      app: AppResolver
    },
    children: [
      {
        path: 'user/:uid',
        resolve: {
          user: UserResolver
        },
        children: [
          {
            path: '',
            component: ViewUserComponent
          },
          {
            path: 'edit',
            component: EditUserComponent
          }
        ]
      }
    ]
  }
];

Пользовательские данные извлекаются UserResolver для любых детей маршрута /user/:uid, Используя эти данные, профиль пользователя можно просмотреть, перейдя к /user/:uid а затем редактировать, перейдя к /user/:uid/edit, После успешного редактирования можно ожидать перенаправления на обновленный профиль пользователя (/user/:uid).

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

Следовательно, при переходе назад от компонента редактирования к компоненту представления отображаемые данные остаются прежними, не обновленными.

Будет ли какой-либо способ сделать недействительным user данные, чтобы заставить распознаватель снова получить его с сервера? Или есть какой-то другой способ достичь такого результата?

app данные остаются неизменными, нам не нужно их перезагружать.

2 ответа

Я протестировал решение 'runGuardsAndResolvers', оно работает для моего варианта использования, распознаватель вызывается при каждом изменении подстраницы.

Это только добавление этой опции к той части ваших маршрутов, которую вы хотите вести себя таким образом.

export const ROUTES: any = [
  {
    path: 'project/:name',
    runGuardsAndResolvers: "always",
    component: ProjectComponent,
    resolve: { project: ProjectResolver },
    children: [
      ...

В конфигурации маршрута вы можете использовать параметр runGuardsAndResolvers, который будет влиять на запуск распознавателя. В этом случае вы захотите установить "всегда". Это означает, что распознаватель будет запускаться каждый раз, когда изменяются дочерние маршруты этого маршрута. См. Маршрутную документацию для получения дополнительной информации.

Вы можете попробовать что-то вроде этого:

constructor(private activatedRoute: ActivatedRoute) {
  this.activatedRoute.parent.data.subscribe(data => {
    this.profile = data.profile;
  });
}

updateProfile(newProfile) {
  (this.activatedRoute.parent.data as BehaviorSubject<any>).next({profile: newProfile});
}

По вышеупомянутому способу я могу вызвать распознаватель. Но это не изменение данных, поступающих с моего внутреннего сервера, поэтому я получил одно решение: я снова вызываю свой метод обслуживания в части успеха и получил новые измененные данные с внутреннего сервера.

Другие вопросы по тегам