动态侧边栏Angular

时间:2019-03-19 10:55:05

标签: angular typescript routing sidebar

这可能是stackoverflow上反复出现的主题(如快速的“角边栏”搜索所示),但我仍然不相信这样做的“正确”方法是什么。

为设置背景,我使用类似于以下的路由制作了我的应用程序(由于公司IP的原因而更改了名称):

const appRoutes: Routes = [
  {
    path: '',
    canActivate: [AuthGuard],
    component: MainLayoutComponent,
    children: [
      { path: '', redirectTo: '/dashboard', pathMatch: 'full' },
      { path: 'dashboard', component: MainDashboardComponent },
      {
        path: 'user-stuff',
        children: [
          { path: '', redirectTo: 'dashboard', pathMatch: 'full' },
          { path: 'dashboard', component: UserStuffDashboardComponent },
          {
            path: 'users',
            children: [
              { path: '', component: UserListComponent },
              {
                path: 'add',
                children: [
                  { path: ':id', component: UserFormComponent }, // edit and view users crud
                  { path: '', component: UserFormComponent } // add new users crud
                ]
              },
            ]
          },
        ]
      },
    ]
  },
  // TODO: fall-trough redirect on '' is not working for some reason. Redirection is being done manually in guard.
  { path: '', redirectTo: '/login', pathMatch: 'full' },
  { path: 'login', component: LoginComponent },
  { path: '**', canActivate: [AuthGuard], component: PageNotFoundComponent }
];

这意味着我的主要组件中有第一个路由器出口,可以加载MainLayout(包含带有侧栏顶部栏脚等的仪表板布局)或诸如login和404页面之类没有侧栏的页面。 然后MainLayout组件为主要内容/主体实现了第二个路由器出口,该内容随导航而变化,而侧边栏,顶部栏和页脚则保持不变。

<div class="app-body">
  <app-sidebar></app-sidebar>

  <div class="app-main">
    <app-header></app-header>

    <div class="app-content">
      <div class="app-box">
        <router-outlet></router-outlet>
      </div>
    </div>
  </div>
</div>

<app-footer></app-footer>

现在,我需要一个可重复使用的侧边栏菜单,该菜单栏能够显示深度嵌套的导航(类似于Angular教程侧边栏菜单),最好形成一个配置JSON(我基本上是在此处渲染树形视图),因此我制作了递归组件效果很好,但这是真正的问题:

  

我应该如何/何时确切地向边栏提供其配置文件?

我当然可以想到许多解决方案,但是我不确定哪一个是最合逻辑的。我应该优先考虑简单性吗?可重用性有角度的做事方式? 现在,我正在考虑两种可能的实现方式:

  

A。如果简单是关键,那么我的第一个教导就是使用   解析器,并给我的MainLatoutComponent一个巨大的layoutConfigObject   将溃败网址作为键,将侧边栏配置对象作为值,然后   侦听MainLayoutComponent内路由器出口上的更改,然后   通过@Input输入我的sidebarComponent正确的配置文件   每个路由器网址。但这让我觉得我正在重新编码   路由器。


  

B。如果角度方式是关键(如果我们看看什么是   在某些stackoverflow主题中推荐),那么我应该使用   名称为“ sidebar”的路由器出口,然后为每个路由   在我的路由器中调用其他侧边栏组件。即使我有一个   应该仅包含配置的“愚蠢/简单组件”   文件并渲染菜单,从技术上讲,我可以在每条路线上进行操作   放置一个:

{ path: 'some-path', component: SidebarComponent, outlet: 'sidebar', resolve: { menuConfig: SidebarConfigResolver } }
     

但是,如何有效地将数据提供给SidebarConfigResolver?   我是否仍使用路由作为键并使用menuConfig进行大型配置?   一个值 ?还是为每个路由都使用不同的解析器?我可以吗   给我的解析器提供参数,并在每个路径提要中手动给参数   menuConfig对象?此外,为每个单身制作侧边栏路线   我认为这条路线很愚蠢。通往多角度样板的方式   一两个月之内,不忠将使我烦恼。

无论如何,这些可能不是唯一的选择,甚至可能不是最佳选择。现在,我非常倾向于选择选项A,但选择项B似乎正处于正确的轨道上。有什么想法吗?

0 个答案:

没有答案