gpt4 book ai didi

angular - 如何从 Angular2 和 ng-bootstrap 的组件中的 NgbTabSet 访问 'select' 方法?

转载 作者:太空狗 更新时间:2023-10-29 16:59:32 26 4
gpt4 key购买 nike

使用 Angular 2.3.1 和 ng-bootstrap 1.0.0-alpha.18。我正在尝试以编程方式选择基于组件 ID 的选项卡,而不是从模板中选择选项卡。目标是从 url 中提取参数并使用它来选择 ngOnInit 中的选项卡

模板

<section id="policy-terms">
<ngb-tabset>
<ngb-tab title="Terms and Privacy" id="terms">
<template ngbTabContent>
<div class="container page-content">

</div>
</template>
</ngb-tab>
<ngb-tab title="Company Policy" id="policy">
<template ngbTabContent>
<div class="container page-content">

</div>
</template>
</ngb-tab>

</ngb-tabset>
</section>

以及组件代码:

import { Component, OnInit } from '@angular/core';
import { NgbTabset } from '@ng-bootstrap/ng-bootstrap';

@Component({
selector: 'app-policy-terms',
templateUrl: './policy-terms.component.html',
styleUrls: ['./policy-terms.component.scss'],
providers: [
NgbTabset
]
})
export class PolicyTermsComponent implements OnInit {

constructor(
public tabset: NgbTabset
) { }

ngOnInit() {
this.tabset.select('policy');
}
}

这只会产生一个错误:

Console log errors

如何访问此方法?

最佳答案

使用 Ngb-TabSet 进行路由

在 AngularJs 1.x 中,使用 ui-router 设置名称路由非常简单。在带有 Ng-Bootstrap 的 Angular 2 中,它并不那么明显。从好的方面来说,您需要的东西在原生 Angular 2 库中可用。

设置路由配置

export const appRoutes: Routes =
[
{ path: 'prospect/:prospectid/details', component: ProspectTabsView, data:{name:'details'} },
{ path: 'prospect/:prospectid/appointments', component: ProspectTabsView, data:{name:'appointments'} },
{ path: 'prospect/:prospectid/followups', component: ProspectTabsView, data:{name:'followups'} },
{ path: 'prospect/:prospectid/contacts', component: ProspectTabsView, data:{name:'contacts'} },
{ path: '', component: DashboardView },
{ path: '**', redirectTo: '', pathMatch: 'full'}
];

配置很简单,只有一个异常(exception):[data] 属性。您会注意到它有一个名为 name 的 key .这是路线的名称。将其视为数据袋的数据属性。您可以添加的不仅仅是路线名称。

设置 TabSet 标记

<ngb-tabset #tabs>
<ngb-tab id="details">
<ng-template ngbTabTitle>
<a [routerLink]="['/prospect', prospectId, 'details']">Details</a>
</ng-template>
<ng-template ngbTabContent>
</ng-template>
</ngb-tab>
<ngb-tab id="contacts">
<ng-template ngbTabTitle>
<a [routerLink]="['/prospect',prospectId,'contacts']">Contacts</a>
</ng-template>
<ng-template ngbTabContent>
</ng-template>
</ngb-tab>
<ngb-tab id="appointments">
<ng-template ngbTabTitle>
<a [routerLink]="['/prospect', prospectId, 'appointments']">Appointments</a>
</ng-template>
<ng-template ngbTabContent>
</ng-template>
</ngb-tab>
<ngb-tab id="followups">
<ng-template ngbTabTitle>
<a [routerLink]="['/prospect', prospectId, 'followups']">Follow Ups</a>
</ng-template>
<ng-template ngbTabContent>
</ng-template>
</ngb-tab>
</ngb-tabset>

上面的选项卡标记没有什么神奇之处,您需要注意几件事:首先是在 ngb-tabset 中。元素,我们声明了变量 #tab .我们将使用 #tab稍后在组件中。二、各nbg-tab有一个 id设置与我们在路由配置中定义的名称相匹配(即 data:{name:'followups'} )。

设置组件

import {
AfterViewChecked, Component, OnInit,
ViewChild
} from '@angular/core';
import '../../assets/css/styles.css';
import {ActivatedRoute} from "@angular/router";
import {NgbTabset} from "@ng-bootstrap/ng-bootstrap";

@Component({
templateUrl: './tabs.view.html'
})
export class ProspectTabsView implements OnInit, AfterViewChecked{
prospectId: number;
selectedTab:string;

@ViewChild('tabs')
private tabs:NgbTabset;

constructor(private route: ActivatedRoute) {
this.route.data.subscribe(d=>{
this.selectedTab = d.name;
});
}

ngOnInit(): void {
this.route.params.subscribe(
params => {
this.prospectId = +params['prospectid'];
}
);
}

ngAfterViewChecked(): void {
if(this.tabs) {
this.tabs.select(this.selectedTab);
}
}
}

本练习中最难的部分是正确执行顺序。如果不正确,则在操作之前不会初始化集合或属性。我们将从类(class)的顶端开始,然后逐步下降。

首先,我们有变量。 prospectId是数据的主键,selectedTab是当前所选选项卡的名称,最后,我们有 tabs多变的。 tabs是对我们添加到 #tab 的属性 ( ngb-tabset) 的引用元素。

接下来是 constructor .在文档中并不明显,但是data是一个 Observable<data> .为了获取值(value),我们订阅了 data。来自路线的属性(property)。

constuctor 之后是 ngOnInit .这对选项卡并不重要,但它确实捕获了我们在选项卡路由中使用的 prospectId。如果您的 route 没有任何动态数据,那么您不需要这个。

最后,我们有ngAfterViewChecked .用于路由 tabs ,这是最重要的。这里我们使用 tabs我们从标记中捕获的变量,它是我们将选定的选项卡名称传递给 tabs 的地方更改选定的选项卡。

更新

为了让它正常工作,我必须添加 Hook 到 tabChange ngb-tabset 上的事件.

HTML:

<ngb-tabset [activeId]="selectedTab" #tabs (tabChange)="onTabChange($event)">

typescript :

另外,我必须在 onTabChange 函数中对路由进行硬编码。

onTabChange($event: NgbTabChangeEvent) {
let routes = {
details: `/prospect/${this.prospectId}/details`,
appointments: `/prospect/${this.prospectId}/appointments`,
followups: `/prospect/${this.prospectId}/followups`,
notes: `/prospect/${this.prospectId}/notes`,
dials: `/prospect/${this.prospectId}/dials`,
};

this.router.navigateByUrl(routes[$event.nextId]);
}

关于angular - 如何从 Angular2 和 ng-bootstrap 的组件中的 NgbTabSet 访问 'select' 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42446434/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com