【问题标题】:Angular 2 RC 4 - hashlocationstrategy no longer working [duplicate]Angular 2 RC 4 - hashlocationstrategy 不再工作 [重复]
【发布时间】:2016-11-10 22:57:21
【问题描述】:

我们已将 Angular 2 项目升级到 Release Candidate 4。

我们正在使用 HashLocationStrategy 来刷新浏览器中的页面(使用 BrowserSync)。 但是对于 RC4,这不再有效。 没有组件被加载到路由器插座中。 但是,使用菜单项的 routerlink 确实有效。

RC4 的 HashLocationStrategy 是否损坏,或者我们没有正确使用它? 我们还没有在互联网上找到任何信息。 (现在只是试图通过 Angular2 源代码来了解发生了什么)

更新:这里是代码。

此外,我们似乎无法找到让默认路由正常工作的方法。 尝试了如下所示的空路径,尝试了重定向...似乎没有什么会触发默认路由,该路由会将组件加载到路由出口中。

// boot:

import {bootstrap} from '@angular/platform-browser-dynamic';

import {AppComponent} from './app.component';

bootstrap(AppComponent)
    .catch(err => console.log(err));


// AppComponent:

import {Component, provide, ExceptionHandler} from '@angular/core';
import {HTTP_PROVIDERS, XHRBackend} from '@angular/http';
import {CORE_DIRECTIVES, LocationStrategy, HashLocationStrategy} from '@angular/common';
import {TranslatePipe, TranslateService, TRANSLATE_PROVIDERS} from 'ng2-translate/ng2-translate';

import {SideMenuComponent} from './navigatie/index';
import {AppSettingsService, Auth, MockBackendToggle} from './shared/index';
import {EssStorage} from './shared/ess-storage';
import {EssHttp} from './shared/ess-http';
import {DienstverbandService} from './dienstverband/shared/dienstverband.service';
import {HeaderMenuComponent} from './navigatie/headermenu/headermenu.component';
import {WerknemerService} from './werknemer/werknemer.service';
import {PersoonService} from './werknemer/persoon/shared/persoon.service';
import {RouterOutlet} from '@angular/router';
import {APP_ROUTER_PROVIDER} from './navigatie/routes';
import {AuthGuard} from './shared/auth/auth-guard';
import {EssExceptionHandler} from './shared/ess-exception-handler';


@Component({
    selector: 'ess-app',
    pipes: [TranslatePipe],
    directives: [CORE_DIRECTIVES, SideMenuComponent, HeaderMenuComponent, RouterOutlet],
    providers: [TRANSLATE_PROVIDERS, TranslateService, HTTP_PROVIDERS, EssHttp, WerknemerService, APP_ROUTER_PROVIDER, AuthGuard,
                AppSettingsService, Auth, DienstverbandService, PersoonService, provide(XHRBackend, {useClass: MockBackendToggle}),
                provide(LocationStrategy, {useClass: HashLocationStrategy}), provide(ExceptionHandler, {useClass: EssExceptionHandler})],
    template: `
    <div id='main'>
        <div class='header  hidden-xs' *ngIf="_auth !== undefined && _auth.isLoggedIn()">
            <header>
                <ess-headermenu></ess-headermenu>
            </header>
       </div>

        <div class='ess-sidemenu-container visible-lg' *ngIf="_auth !== undefined && _auth.isLoggedIn()">
            <ess-sidemenu></ess-sidemenu>
        </div>

        <div class='main-content-container col-lg-12'>
            <section> 
                <section id='content'>
                    <div>
                        <router-outlet></router-outlet>
                    </div>
                </section>
            </section>
        </div>
    </div>`
})
export class AppComponent { //..}

// routes:

import {provideRouter, RouterConfig} from '@angular/router';
import {DashboardComponent} from '../dashboard/index';
import {PersonaliaComponent} from '../werknemer/index';
import {LoginComponent} from '../login/index';
import {AuthGuard} from '../shared/auth/auth-guard';

export const appRoutes: RouterConfig = [
    {path: '',                      component: LoginComponent},
    {path: 'login/:url',            component: LoginComponent},
    {path: 'dashboard',             component: DashboardComponent},
    {path: 'personalia',            component: PersonaliaComponent,             canActivate: [AuthGuard]}
];

export const APP_ROUTER_PROVIDER = provideRouter(appRoutes);

更新:

当我通过单击链接并使用 [routerLink] 导航到视图时,路由器插座将被正确的组件填充。例如,当导航到“自动”时。

<li class="submenuitem" [routerLink]="['auto']"><a href="#"><span>{{'AUTO' | translate}}</span></a></li>

但是当我例如刷新“自动”页面时,路由器插座变为空。

【问题讨论】:

  • 您在哪里提供HashLocationStrategy?如果在 bootstrap 调用中,请尝试将其移动到根组件的 providers 数组中。
  • 我们的引导调用有零个提供者。我们在 AppComponent 的 providers 数组中拥有所有“全局”提供者。
  • 在问题中添加引导代码
  • 我也可以重现这个问题。即使我在根组件中定义了LocationStrategy,路由器也会默认使用 HTML 5 定位策略。
  • 您需要显示引导代码,然后才能提供任何帮助

标签: angular refresh


【解决方案1】:

在 Angular 2 rc4 中,LocationStrategy 似乎已从路由器移至通用。您必须从那里导入它。

还要注意“提供”行周围的大括号。

rc4: main.ts

// Imports for loading & configuring the in-memory web api
import { XHRBackend } from '@angular/http';

// The usual bootstrapping imports
import { bootstrap }      from '@angular/platform-browser-dynamic';
import { HTTP_PROVIDERS } from '@angular/http';

import { AppComponent }         from './app.component';
import { APP_ROUTER_PROVIDERS } from './app.routes';
import { Location, LocationStrategy, HashLocationStrategy} from '@angular/common';

bootstrap(AppComponent, [
    APP_ROUTER_PROVIDERS,
    HTTP_PROVIDERS,
    {provide: LocationStrategy, useClass: HashLocationStrategy}
]);

rc5:app.module.ts

在 rc.5 中,由于对 main.ts 的重大更改,这再次更改。 Hashlocationstrategy 现在作为导入 RouterModule 时的一个选项在 app.module.ts 中实现。

@NgModule({
imports: [routing, RouterModule.forRoot(routing,{ useHash: true })],

2.0.0:app.module.ts

在 Angular 2.0.0(= 发布版本)中,Hashlocationstrategy 保留在 app.module.ts 中,但措辞略有改变。它现在与提供者坐在一起。

...
import { LocationStrategy, HashLocationStrategy } from '@angular/common';
...  

@NgModule({
  bootstrap: [AppComponent],
  imports: [
    //all your modules
  ],
  declarations: [
    //all your components
  ],
  providers: [
    //all your services
    {provide: LocationStrategy, useClass: HashLocationStrategy},
  ]
})

【讨论】:

  • 为我工作,非常感谢:)
猜你喜欢
  • 1970-01-01
  • 2017-01-13
  • 2017-01-10
  • 2017-02-13
  • 2016-10-18
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多