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

前端之家收集整理的这篇文章主要介绍了如何从Angular2和ng-bootstrap中的组件中的NgbTabSet访问“select”方法?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用Angular 2.3.1和ng-bootstrap 1.0.0-alpha.18.我试图以编程方式从组件中选择基于ID的选项卡,而不是从模板中选择.目标是从URL中提取param并使用它来选择ngOnInit中的选项卡

模板

  1. <section id="policy-terms">
  2. <ngb-tabset>
  3. <ngb-tab title="Terms and Privacy" id="terms">
  4. <template ngbTabContent>
  5. <div class="container page-content">
  6.  
  7. </div>
  8. </template>
  9. </ngb-tab>
  10. <ngb-tab title="Company Policy" id="policy">
  11. <template ngbTabContent>
  12. <div class="container page-content">
  13.  
  14. </div>
  15. </template>
  16. </ngb-tab>
  17.  
  18. </ngb-tabset>
  19. </section>

和组件代码

  1. import { Component,OnInit } from '@angular/core';
  2. import { NgbTabset } from '@ng-bootstrap/ng-bootstrap';
  3.  
  4. @Component({
  5. selector: 'app-policy-terms',templateUrl: './policy-terms.component.html',styleUrls: ['./policy-terms.component.scss'],providers: [
  6. NgbTabset
  7. ]
  8. })
  9. export class PolicyTermsComponent implements OnInit {
  10.  
  11. constructor(
  12. public tabset: NgbTabset
  13. ) { }
  14.  
  15. ngOnInit() {
  16. this.tabset.select('policy');
  17. }
  18. }

这只会产生一个错误

Console log errors

我该如何访问此方法

使用Ngb-TabSet进行路由

在AngularJs 1.x中使用ui-router设置名称路由是直截了当的.在带有Ng-Bootstrap的Angular 2中,它并不那么明显.从好的方面来说,您需要的是原生的Angular 2库.

设置路由配置

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

配置很简单,只有一个例外:[data]属性.您会注意到它有一个名为name的密钥.这是路线的名称.将其视为数据包作为数据包.您可以添加多个路径名称.

设置TabSet标记

  1. <ngb-tabset #tabs>
  2. <ngb-tab id="details">
  3. <ng-template ngbTabTitle>
  4. <a [routerLink]="['/prospect',prospectId,'details']">Details</a>
  5. </ng-template>
  6. <ng-template ngbTabContent>
  7. </ng-template>
  8. </ngb-tab>
  9. <ngb-tab id="contacts">
  10. <ng-template ngbTabTitle>
  11. <a [routerLink]="['/prospect','contacts']">Contacts</a>
  12. </ng-template>
  13. <ng-template ngbTabContent>
  14. </ng-template>
  15. </ngb-tab>
  16. <ngb-tab id="appointments">
  17. <ng-template ngbTabTitle>
  18. <a [routerLink]="['/prospect','appointments']">Appointments</a>
  19. </ng-template>
  20. <ng-template ngbTabContent>
  21. </ng-template>
  22. </ngb-tab>
  23. <ngb-tab id="followups">
  24. <ng-template ngbTabTitle>
  25. <a [routerLink]="['/prospect','followups']">Follow Ups</a>
  26. </ng-template>
  27. <ng-template ngbTabContent>
  28. </ng-template>
  29. </ngb-tab>
  30. </ngb-tabset>

上面的标签标记没什么神奇的,有几件事要注意:首先是在ngb-tabset元素中,我们已经声明了变量#tab.我们稍后会在组件中使用#tab.其次,每个nbg-tab都有一个id集,它与我们在路由配置中定义的名称相匹配(即data:{name:’followups’}).

设置组件

  1. import {
  2. AfterViewChecked,Component,OnInit,ViewChild
  3. } from '@angular/core';
  4. import '../../assets/css/styles.css';
  5. import {ActivatedRoute} from "@angular/router";
  6. import {NgbTabset} from "@ng-bootstrap/ng-bootstrap";
  7.  
  8. @Component({
  9. templateUrl: './tabs.view.html'
  10. })
  11. export class ProspectTabsView implements OnInit,AfterViewChecked{
  12. prospectId: number;
  13. selectedTab:string;
  14.  
  15. @ViewChild('tabs')
  16. private tabs:NgbTabset;
  17.  
  18. constructor(private route: ActivatedRoute) {
  19. this.route.data.subscribe(d=>{
  20. this.selectedTab = d.name;
  21. });
  22. }
  23.  
  24. ngOnInit(): void {
  25. this.route.params.subscribe(
  26. params => {
  27. this.prospectId = +params['prospectid'];
  28. }
  29. );
  30. }
  31.  
  32. ngAfterViewChecked(): void {
  33. if(this.tabs) {
  34. this.tabs.select(this.selectedTab);
  35. }
  36. }
  37. }

本练习中最难的部分是使执行顺序正确.如果不正确,则在操作之前不会初始化集合或属性.我们将从课程的顶端开始,继续努力.

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

接下来是构造函数.它在文档中并不明显,但数据是Observable< data>.要捕获该值,我们将订阅路由中的data属性.

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

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

更新

为了使其正常工作,我不得不添加钩子到ngb-tabset上的tabChange事件.

HTML:

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

打字稿:

此外,我不得不在onTabChange函数中硬编码路由.

  1. onTabChange($event: NgbTabChangeEvent) {
  2. let routes = {
  3. 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`,};
  4.  
  5. this.router.navigateByUrl(routes[$event.nextId]);
  6. }

猜你在找的Angularjs相关文章