浏览浏览器网址

时间:2017-03-15 12:08:53

标签: angular typescript angular2-routing angular2-router3

我对Angular项目的路由存在一些问题,主要是第三级子路由。在应用程序上导航时,这些路线完美地工作。 (routerLink),通过浏览器网址访问网址时出现问题。

My Angular版本是2.4.0
我正在使用ng serve在开发服务器上进行测试。

对于具有给定结构的项目,

.
├── photos
├── posts
├── users
│   ├── detail
│   │   ├── address
│   │   ├── family
│   │   ├── information
│   │   └── phones
│   ├── friends
│   └── profile
└── videos

以下是代码,

// user routes
export const userRoutes : Routes = [
  {
    path: 'detail',
    component: DetailComponent
  },
  {
    path: 'friends',
    component: FriendsComponent
  },
  {
    path: 'profile',
    component: ProfileComponent
  }
]

//app routes
const appRoutes: Routes = [
  {
    path: '',
    component: HomeComponent
  },
  {
    path: 'photos',
    component: PhotosComponent
  },
  {
    path: 'posts',
    component: PostsComponent
  },
  {
    path: 'users',
    component: UserListComponent
  },
  {
    path: 'user/:username',
    component: UserComponent,
    children: userRoutes
  },
  {
    path: 'videos',
    component: VideosComponent
  }
]
export const AppRoutes = RouterModule.forRoot(appRoutes);
export const appRoutingProviders: any[] = [];

并注册为,

@NgModule({
  declarations: [
    // declarations
  ],
  imports: [
    AppRoutes
  ],
  providers: [
    appRoutingProviders
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

因此,应用程序适用于RouterLink

[routerLink]="['/user', username, 'detail']

但是当我浏览浏览器<host>/user/myuser/detail时,它会引发异常

Uncaught (in promise): Error: Cannot find primary outlet to load 'DetailComponent'

什么错了?感谢。

注意:我已经设置<router-outlet>并且在routerLink上工作正常,当浏览器中的完整网址导航时会出现问题。

4 个答案:

答案 0 :(得分:5)

我假设当您从user/:username/导航到/user/:username/detail时,您需要UserComponent隐藏模板上的所有内容并显示DetailComponent

因此,要实现这一目标,您需要一个将加载其子组件的组件:

<强> parent.component.html

<router-outlet></router-outlet>

<强> routes.ts

现在让我们设置路由,以便user/:username/加载到父组件

// user routes
export const userRoutes : Routes = [
 {
    path: '',
    component: UserComponent // the '' path will load UserComponent
  },
  {
    path: 'detail',
    component: DetailComponent
  },
  {
    path: 'friends',
    component: FriendsComponent
  },
  {
    path: 'profile',
    component: ProfileComponent
  }
]

//app routes
const appRoutes: Routes = [
  {
    path: '',
    component: HomeComponent
  },
  {
    path: 'photos',
    component: PhotosComponent
  },
  {
    path: 'posts',
    component: PostsComponent
  },
  {
    path: 'users',
    component: UserListComponent
  },
  {
    path: 'user/:username',
    component: ParentComponent, //This component will load its children
    children: userRoutes
  },
  {
    path: 'videos',
    component: VideosComponent
  }
]
export const AppRoutes = RouterModule.forRoot(appRoutes);
export const appRoutingProviders: any[] = [];

所以,这里发生的事情是当你导航到user/:username ParentComponent时加载了UserComponent加载到父组件的出口(因为''路径对应于{ {1}})

以下是一个有效的示例: Github

当您访问user/:username时,它将显示:用户正常工作! user/myuser将显示:详细信息有效!如下所示(不使用routerlink)

enter image description here

答案 1 :(得分:0)

您是否设置了<base href="/">?

你的后端是什么?如果用户首先导航到应用程序子页面的完整URL(例如www.mysite.com/users/john-doe),并且您的后端没有返回角度2引导页面(index.html带有引导脚本) ,然后角度路由器将永远不会启动,虽然我认为这不是你的情况下的问题,因为你从角度获得错误。

我的.net核心后端设置为始终为非静态文件的请求返回index.html,因此它始终正确加载应用程序并使用角度路由。

答案 2 :(得分:0)

在标签内使用<base href="/">注意 <base href="/">,它应该位于head标签顶部。

<head>
  <base href="/">
 other css and jquery ...
</head>

路由

const appRoutes: Routes = [
    {
        path: 'Admin',
        component: AdminComponent,
        children: [

            {
                path: 'CandidateInfo',
                component: CandidateInfoComponent
            },
            {
                path: 'RptCandidateInfo',
                component: RptCandidateInfoComponent
            },
            {
                path: 'RptCandidateInfoDT',
                component: RptCandidateDTInfoComponent
            }
        ]
    },
];

运行正常。

答案 3 :(得分:-3)

在html routerLink =“/ user”中使用此代码,请在routing.ts中提及您的路径,当您单击此路由器链接时,它将跳转到相关链接