【问题标题】:Dynamic Routing with tabs in angular2 4angular2 4中带有标签的动态路由
【发布时间】:2018-08-05 22:55:21
【问题描述】:

今天遇到路由问题,需要各位帮忙,

实际上,我有一个侧边栏,其中有动态树视图导航,如下面和右侧我有 4 个选项卡默认选项卡 1 将被选中,我在其中显示活动链接的数据

Link1
--sublink1
--sublink2
----sub2link1
------sub3link1
Link2
Link3
--sublink1
----sub2link1

和上面一样,我有第 N 个子菜单,为此,我创建了一条路线

{ path: '**', component: tab1}

当我访问链接“link1/sublink2/sub2link1”时,默认它将是一个tab1组件

现在我的问题是,如果我想使用相同的链接导航到 tab2 组件,那么我的路由 url 应该是怎样的。

【问题讨论】:

  • 您是否使用 children 属性来定义您的路线?
  • 尝试向其中添加子元素,但它也仅使用 tab1

标签: angular typescript routing angular2-routing angular4-router


【解决方案1】:

我正在回答我自己的问题,我使用QueryParameter 解决了这个问题,下面是我的方法:

我的路由模块将是:

const routes: Routes = [
{
  path: 'parent',
  component: parentComponent,
  children: [
    { path: '', component: allChildComponent},
    { path: '**', component: allChildComponent}
  ]
}
];

所以这将接受导航直到 N 个树路径,如 /parent/child/sub_child1/sub_child2/../../.... 来导航,只需使用

this.router.navigate(['/parent/child/sub_child1/sub_child2/../../....']);

现在,如果我们想将参数传递给** 路由,那么您需要在导航时使用如下所示的查询参数

this.router.navigate(
   ['/parent/child/sub_child1/sub_child2/../../....'],
   {queryParams: 
       {param1: 'value1', param2: 'value2'}
   }
);

最后,您可以在组件中读取此参数,如下所示

constructor(private route: ActivatedRoute) { }

ngOnInit() {
  this.sub = this.route.queryParams
    .subscribe(params => {
      console.log(params);
    });
}

【讨论】:

    【解决方案2】:

    如果不编写一些自定义逻辑来保存状态,您无法使用这样的包罗万象的路线来实现这一点。

    有两种方法可以实现您想要的(以下两个示例都显示)。

    1. 使用独特的路线。这样您就可以使用routerLink,并且可以根据路由器配置轻松确定哪个路由处于活动状态。使用这种方法,您不能使用 ** 包罗万象的路由,因为它取决于路由器。
    2. 使用某种状态,混合使用 Observables,这样您就可以从任何地方切换侧边栏并确定活动链接的方式。通过这种方法,您可以使用 ** 包罗万象的路由,因为这不依赖于路由器。

    我将展示下面的两个示例,但在此之前我应该​​提出一个警告。该答案基于对您的业务逻辑一无所知。

    我的意思是,如果您的侧边栏是数据驱动的,那么它可能会改变您做事的方式。例如,在我的应用程序中,我有一个类似于您的示例的树形视图侧边栏,但我的是数据库驱动的,这意味着每个项目都有一个唯一的标识符。使用该 ID,我可以只使用像 /topic/:topicId/subtopic/:subtopicId 这样的路由,并且如果 URL 中当前的 topicId 等于 a侧边栏链接上的特定topicId,依此类推。这使它变得微不足道。

    尽管如此,给你:


    方法#1

    使用下面的树视图链接,您可以导航到以下链接,相应的链接将变为活动状态:

    1. /link1
    2. /link1/sublink1
    3. /link1/sublink1/sub2link1
    4. /link1/sublink2
    5. /link2
    6. /link3

    示例侧边栏:

    <ul>
        <li>
            <a [routerLink]="['/link1']" [routerLinkActive]="'active'">Link1</a>
    
            <ul>
                <li>
                    <a [routerLink]="['/link1/sublink1']" [routerLinkActive]="'active'">Sublink1</a>
    
                    <ul>
                        <li>
                            <a [routerLink]="['/link1/sublink1/sub2link1']" [routerLinkActive]="'active'">Sub2link1</a>
                        </li>
                    </ul>
                </li>
                <li>
                    <a [routerLink]="['/link1/sublink2']" [routerLinkActive]="'active'">Sublink2</a>
                </li>
            </ul>
        </li>
        <li>
            <a [routerLink]="['/link2']" [routerLinkActive]="'active'">Link2</a>
        </li>
        <li>
            <a [routerLink]="['/link3']" [routerLinkActive]="'active'">Link3</a>
        </li>
    </ul>
    

    方法 #2

    使用这种方法,而不是使用routerLink 进行导航,您可能必须调用在您的组件或某处的服务中定义的函数,并且它们的功能会在导航之前设置一些状态。当它设置该状态时,侧边栏必须监听变化(可能是Observable),并且侧边栏可以根据这些变化切换某些链接的活跃度。

    这是一个伪代码示例:

    模板:

    <ul>
        <li>
            <a (click)="toggleSidebar('link1')" [class.active]="activeLink === 'link1'">Link1</a>
        </li>
        <li>
            <a (click)="toggleSidebar('link2')" [class.active]="activeLink === 'link2'">Link2</a>
    
            <ul>
                <li>
                    <a (click)="toggleSidebar('link2/sublink1')" [class.active]="activeLink === 'link2/sublink1'">Link2 Sublink1</a>
                </li>
            </ul>
        </li>
    </ul>
    

    组件:

    @Component({...})
    export class MyComponent implements OnInit {
        activeLink: string;
    
        constructor(private sidebarService: SideberService) {}
    
        ngOnInit() {
            this.sidebarService.activeLink$.subscribe((activeLink: string) => {
                this.activeLink = activeLink;
            }));
        }
    
        toggleSidebar(activeLink: string) {
            this.sidebarService.activeLink.next(activeLink);
        }
    }
    

    服务:

    @Injectable()
    export class SidebarService {
        activeLink: ReplaySubject<string> = new ReplaySubject();
        activeLink$: Observable<string> = this.activeLink.asObservable();
    }
    

    现在,每当您向sidebarService.activeLink 流中发出值时,侧边栏组件(应该订阅该可观察对象)将获得活动的侧边栏链接,然后您可以在模板中使用该链接,如我的示例所示切换某个侧边栏链接。

    如果您希望侧边栏默认为某个链接,您可以从ReplaySubject 切换到使用BehaviorSubject 并为其指定默认值,例如link1。例如:

    @Injectable()
    export class SidebarService {
        activeLink: BehaviorSubject<string> = new BehaviorSubject('link1');
        activeLink$: Observable<string> = this.activeLink.asObservable();
    }
    

    这样在页面加载时,侧边栏中的link1 将默认处于活动状态,因为这是流中的初始值。

    【讨论】:

    • 嗨 Lansana,这并没有回答我的问题。但是感谢您的努力。这将在未来帮助我
    • 你能详细说明你的问题吗?我的答案缺少什么?
    【解决方案3】:

    现在我的问题是,如果我想使用相同的链接导航到 tab2 组件,那么我的路由 url 应该是怎样的。

    这是不可能的。您需要将选项卡的状态保存在某个位置(例如在某个共享对象中)或为每个选项卡创建一个新路由。

    【讨论】:

      猜你喜欢
      • 2019-08-28
      • 2016-07-06
      • 2014-01-14
      • 2021-06-12
      • 2016-10-04
      • 2020-09-08
      • 2018-10-30
      • 1970-01-01
      • 2021-06-28
      相关资源
      最近更新 更多