【问题标题】:Adding routing for page navigation in angular tree在角度树中为页面导航添加路由
【发布时间】:2019-05-16 06:34:03
【问题描述】:

我在向 Angular 树添加路由方面需要帮助。

HTML 代码:

<mat-tree [dataSource]="dataSource" class="tree-container" [treeControl]="treeControl">
     <mat-tree-node class="btnLinks" *matTreeNodeDef="let node" matTreeNodePadding>
      <button mat-icon-button disabled></button>
      {{node.name}}
    </mat-tree-node>
    <mat-tree-node class="btnLinks" *matTreeNodeDef="let node;when: hasChild" matTreeNodePadding>
      <button mat-icon-button matTreeNodeToggle
              [attr.aria-label]="'toggle ' + node.name">
        <mat-icon class="mat-icon-rtl-mirror">
          {{treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'}}
        </mat-icon>
      </button>
      {{node.name}}
    </mat-tree-node>
  </mat-tree>

.ts 文件

interface ProfileList {
  name: string;
  children?: ProfileList[];
}

const PROFILE_DATA: ProfileList[] = [
  {
    name: 'General',
  }, 
  {
    name: 'Degrees',
  },
];

/** Flat node with expandable and level information */
interface TreeFlatNode {
  expandable: boolean;
  name: string;
  level: number;
}

@Component({
  selector: 'mpn-profile-landing',
  templateUrl: './profile-landing.component.html',
  styleUrls: ['./profile-landing.component.css']
})

export class ProfileLandingComponent {

  public selectedItem : String = '';

  constructor(private breakpointObserver: BreakpointObserver) {
    this.dataSource.data = PROFILE_DATA;
  }

private transformer = (node: ProfileList, level: number) => {
    return {
      expandable: !!node.children && node.children.length > 0,
      name: node.name,
      level: level,
    };
  }

我需要添加路由,比如当我点击度数时,我需要导航到另一个页面,我不确定在哪里放置路由器链接。是否有可能做到这一点? 谢谢。

【问题讨论】:

    标签: angular angular-routing angular-tree-component


    【解决方案1】:

    您可以将{{node.name}} 包装为&lt;span&gt;,例如:

    &lt;span click="navigateToPage(node.name)"&gt;{{node.name}}&lt;/span&gt;

    然后在您的 TS 代码中添加 private router: Router 给你的构造函数 并添加一个类似这样的方法:

    constructor(
      private breakpointObserver: BreakpointObserver,
      private router: Router
    ) {
        this.dataSource.data = PROFILE_DATA;
    }
    
    navigateToPage(name: string) {
      if (name === 'Degrees') {
        this.router.navigate([<THE_ROUTE_YOU_WISH_TO_NAVIGATE_TO>]);
      }
    }
    

    【讨论】:

    • 谢谢,我会试试你的解决方案。我的解决方案是,我忘记在私有转换器和 HTML routerLink="{{node.url}}" 中添加 url: node.url。在下面添加了完整的工作代码。
    【解决方案2】:

    我的工作解决方案:

    HTML:

    <mat-tree   [dataSource]="dataSource" class="tree-container" [treeControl]="treeControl">
            <!-- This is the tree node template for leaf nodes -->
            <mat-tree-node class="btnLinks" routerLink="{{node.url}}" routerLinkActive="active" *matTreeNodeDef="let node" matTreeNodePadding>
              <!-- use a disabled button to provide padding for tree leaf -->
              <button mat-icon-button disabled></button>
              {{node.name}}
    
            </mat-tree-node>
            <!-- This is the tree node template for expandable nodes -->
            <mat-tree-node class="btnLinks" routerLink="{{node.url}}" routerLinkActive="active" *matTreeNodeDef="let node;when: hasChild" matTreeNodePadding>
              <button mat-icon-button matTreeNodeToggle
                      [attr.aria-label]="'toggle ' + node.name">
                <mat-icon class="mat-icon-rtl-mirror">
                  {{treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'}}
                </mat-icon>
              </button>
              {{node.name}}
            </mat-tree-node>
          </mat-tree>
    

    .ts

    interface TreeFlatNode {
      expandable: boolean;
      name: string;
      level: number;
    }
    
    /**
     * @title Tree with flat nodes
     */
    @Component({
      selector: 'mpn-profile-landing',
      templateUrl: './profile-landing.component.html',
      styleUrls: ['./profile-landing.component.css']
    })
    
    export class ProfileLandingComponent {
    
      constructor(private breakpointObserver: BreakpointObserver) {
        this.dataSource.data = PROFILE_DATA;
      }
    
    
      private transformer = (node: ProfileList, level: number) => {
        return {
          expandable: !!node.children && node.children.length > 0,
          name: node.name,
          level: level,
          url: node.url
        };
      }
    
      treeControl = new FlatTreeControl<TreeFlatNode>(
        node => node.level, node => node.expandable);
    
      treeFlattener = new MatTreeFlattener(
        this.transformer, node => node.level, node => node.expandable, node => node.children);
    
      dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener);
    
      hasChild = (_: number, node: TreeFlatNode) => node.expandable;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-10-01
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      • 2019-05-03
      • 2020-02-25
      • 2020-12-08
      • 2016-08-29
      相关资源
      最近更新 更多