Угловое обновление приложения, если URL написан вручную - PullRequest
0 голосов
/ 04 июля 2018

Я использую Angular 6, и у меня проблема с изменением маршрутов. Если я перемещаюсь по приложению с помощью routerLink или метода navigate (), он работает правильно, потому что загружает только новый модуль (при необходимости). Но, например, если я нахожусь по этой ссылке: localhost: 8080 / home, я нажимаю на URL, отменяю 'home', пишу 'profile' и нажимаю Enter, он корректно переходит на страницу профиля, но приложение перезагружается (также компонент приложения). Зачем? Я не могу понять. Это мой маршрут:

const appRoutes: Routes = [
  { path: 'home', component: HomeComponent, canActivate: [AuthGuard] },
  { path: 'profile', component: ProfileComponent, canActivate: [AuthGuard] },
  { path: 'login', component: LoginComponent },
  { path: '', redirectTo: 'home', pathMatch: 'full' },
  { path: '**', component: PageNotFoundComponent }
];

@NgModule({
  imports: [
    RouterModule.forRoot(appRoutes, { preloadingStrategy: PreloadAllModules })
  ],
  exports: [RouterModule]
})
export class AppRoutingModule { }

Может, проблема в auth-guard?

@Injectable()
export class AuthGuard implements CanActivate {

constructor(private store: Store<fromApp.AppState>, private route: ActivatedRoute, private router: Router) {
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    return this.store.select('auth')
        .pipe(take(1),
            map((authState: fromAuth.State) => {
                if (authState.authenticated) {
                    return true;
                } else {
                    let sessionStorageToken: string = sessionStorage.getItem('token');
                    if (sessionStorageToken) {
                        this.store.dispatch(new AuthActions.Login());
                        this.store.dispatch(new AuthActions.SetToken(sessionStorageToken));
                        return true;
                    } else {
                        let url = state.url;
                        this.router.navigate(['/login', { redirectTo: url }]);
                        return false;
                    }
                }
            }));
}
}

Это profile.module.ts:

@NgModule({
declarations: [
    ProfileComponent
],
imports: [
    CommonModule,
    FormsModule
]
 })
 export class ProfileModule { }

Ответы [ 4 ]

0 голосов
/ 04 февраля 2019

вы можете использовать

RouterModule.forRoot(
  ROUTES,
  { useHash: true }
)],

Хеш предотвратит перезагрузку приложения. Поэтому, когда вы нажмете Enter в адресной строке, приложение просто изменит компонент для отображения.

0 голосов
/ 04 июля 2018

Маршрутизация в основном используется для отложенной загрузки приложения, по одному модулю за раз. Каждый маршрут зависит от предыдущего маршрута и так далее. Поэтому, когда вы вручную вводите URL, приложение перезагрузит все компоненты в маршруте.

0 голосов
/ 04 июля 2018

Когда используется routerLink, JavaScript изменяет URL, т.е. он не считается перезагрузкой веб-страницы.

Однако, когда вы нажимаете ввод в адресной строке, страница перезагружается, т. Е. Контент снова подается с сервера, который обслуживает index.html (если у вас нет другого HTML, определенного для обслуживания в место индекса) и, следовательно, приложение повторно инициализируется.

Именно поэтому все компоненты перезагружаются.

Как предлагает @Wesley, вы можете обратиться к угловым документам для получения дополнительной информации.

https://angular.io/guide/router

Вы можете изучить нижеупомянутый блог для целей развертывания.

https://arjunphp.com/deploy-angular-app-production-nginx/

Здесь главное отметить try_files $uri $uri/ /index.html =404;. Когда ввод вводится в адресной строке, NGINX сначала проверяет, соответствует ли данный URL-адрес некоторому файлу / маршруту на сервере. Если он не существует, что в нашем случае localhost:8080/profile, не существует, поскольку такого физического пути нет. Следовательно, NGINX будет обслуживать файл /index.html, который, в свою очередь, будет извлекать все файлы JS, которые, в свою очередь, будут обрабатывать маршрутизацию.

Если вам нужно работать с API, вы можете использовать механизм обратного прокси-сервера NGINX для перенаправления, например, /api/ пути к соответствующему серверу.

0 голосов
/ 04 июля 2018

Когда вы перемещаетесь по routerLink в Angular, базовый JavaScript-код определяет, что подавать в браузер. Это означает, что, когда URL-адрес изменяется через угловой маршрутизатор, он принимает это изменение и соответствующим образом обслуживает компоненты.

Когда вы обновляете URL-адрес вручную и нажимаете ввод, это похоже на переход на новую веб-страницу. Это означает, что серверу потребуется повторно обслуживать базовый веб-сайт, http://localhost:1234, а затем приложение будет обрабатывать маршрут после него, /profile и обслуживать требуемый компонент.

Я попытался объяснить это очень упрощенным способом, для более подробного объяснения, пожалуйста, ознакомьтесь с Angular docs

...