Добавление маршрутизации для навигации по страницам в угловом дереве
Мне нужна помощь в добавлении маршрута к угловому дереву.
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,
};
}
Мне нужно добавить маршрутизацию, например, когда я нажимаю на градусы, мне нужно перейти на другую страницу, я не уверен, где разместить ссылку на маршрутизатор. Можно ли сделать это? Спасибо.
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;
}
Вы можете обернуть {{node.name}}
с <span>
лайк:
<span click="navigateToPage(node.name)">{{node.name}}</span>
тогда в вашем коде 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>]);
}
}