gpt4 book ai didi

Angular 4 - 带有子菜单下拉菜单的下拉菜单(多级)

转载 作者:太空狗 更新时间:2023-10-29 18:19:43 25 4
gpt4 key购买 nike

我刚开始使用 Angular 4 进行开发,我有一个要求。我想知道实现以下内容的最佳方法。

我想在我的网站上创建一个下拉菜单,它出现在我网站的标题上。单击 Dropdowm 菜单图像时,我希望打开一个菜单,当悬停在该菜单上时,该菜单将再次打开其子菜单。

我的 html 是

<span ngbDropdown #myDrop="ngbDropdown" class="dropdown-wrapper">
<img class="hidden-md-up" src="More Menu.svg" aria-hidden="true" ngbDropdownToggle/>
<span ngbDropdownMenu aria-labelledby="dropdownBasic1">
<p class="dropdown-label"><img src="selectall.svg" class="dropdown-item">Select All</p>
<p class="dropdown-label"><img src="filter.svg" class="dropdown-item">Filter</p>
<p class="dropdown-label"><img src="export.svg" class="dropdown-item">Export</p>
<p class="dropdown-label"><img src="edit.svg" class="dropdown-item">Bulk Edit</p>
<p class="dropdown-label"><img src="sort.svg" class="dropdown-item">Sort</p>
<p class="dropdown-label"><img src="tileview.svg" class="dropdown-item" (click)="openSubMenu()">
Tile View
</p>
</span>
</span>

目前我在我的 html 中使用了 ANGULAR-BOOTSTRAP Dropdown 来实现这个,但是我无法创建子菜单。我想在点击上面提到的代码中的最后一项时打开子菜单。

最佳答案

好吧,如果您无论如何都在使用 Angular-Bootstrap,则可以轻松使用 Accordion 模块。如果您正在寻找一种方法来扩展现有的下拉模块,您可能不需要我的解决方案。它可能比您预期的要多一些代码行,但请注意,该结构基本上是 TreeView 的实现,因此您可以随意使用它。

---提前注意:

我将提出一个总体思路,该思路源 self 最近实现的 TreeView 。请注意,代码会让您很好地了解如何实现您想要实现的功能。复制粘贴应该有效,但不能保证。如果您想深入理解它,无论如何都应该阅读整个代码。

---

为了使用我将建议的代码,您需要一些基本结构来指示您的导航结构。一些简单的 json 或 ts 对象应该可以完成这项工作。我会考虑这样的结构:

structure = [
{
title: "foo",
link: "/foo",
children: [
{
title: "bar",
link: "/bar",
children: []
}
]
},
{
title: "baz",
link: "/baz",
children: []
}
];

你应该明白了。这将使您易于更改和实现基本结构,您只需更改对象中的细节即可更改结构。将其放在要呈现导航的父组件中。你可以做不同的事情,但我喜欢使用 Angular 潜力并使代码非常通用的想法。如果您是一名程序员,您就会理解拥有一个易于使用的界面的必要性,该界面基本上可以自行完成所有工作。

要显示结构,您还需要一个 TreeViewComponent,它可能具有以下标记:

<ul class="tree-root-list">
<app-tree-node *ngFor="let item of structure"
[current]="item">
</app-tree-node>
</ul>

您应该已经认识到,您还需要另一个组件来显示您的下拉树导航菜单。应该具有以下(ish)标记的 TreeNodeComponent:

<li class="node-item">

// this function will trigger the final action triggered when a node is selected
// if there are subnodes open the list, else link to the respective page, route, etc..
<p #title (click)="nodeSelected()">

<span class="icon-container">
<span>
//optional icon
</span>
</span>

<span class="node-title">
// optional text
{{title}}
</span>

</p>

<ul class="child-list"
*ngIf="hasChildElements()"
[collapse]="children_collapsed"
(collapsed)="collapsed($event)"
(expanded)="expanded($event)">

// thats the part the structure object comes in handy,
// since you don't need to add several node tags
// you'll just need to add or remove elements in the structure
// variable
<app-tree-node *ngFor="let child of current.children"
[current]="child">
</app-tree-node>
</ul>

</li>

这是 TreeNodeComponent 的一些基本代码。只需根据您的需要进行调整即可使其正常工作。您希望拥有的一般功能应该包含在其中。

@Component({
selector : 'app-tree-node',
templateUrl: './tree-node.component.html',
styleUrls : ['tree-node.component.scss']
})
export class TreeNodeComponent implements OnInit {

// inputs
@Input() current: any;
@Input() is_root: boolean;

// ...

// public members
public children_collapsed = true;

// view nodes
// can be useful when you want to highlight certain nodes depending on specific actions
// though not a requirement for the main task
@ViewChildren(TreeNodeComponent) child_nodes: QueryList<TreeNodeComponent>;

/**
* c'tor ...
*/


/**
* click event when node is selected
*/
public nodeSelected(): void {

// if there are child elements
if (this.hasChildElements()) {

// change collapsed state
this.children_collapsed = !this.children_collapsed;

} else {

// probably route to somewhere, do whatever you want to do with no children present here
}

}

/**
* check whether there are children
*/
public hasChildElements(): boolean {
return this.current.hasOwnProperty("children");
}


/**
* fires if div is collapsed
* @param event
*/
public collapsed(event: any): void {
// change icon
// needed this to give a visual feedback whether the folder is opened or closed
if (this.hasChildElements()) {
this.folder_icon.nativeElement.className = "glyphicon glyphicon-folder-close";
}
}


/**
* fires if div is expanded
* @param event
*/
public expanded(event: any): void {
if (this.hasChildElements()) {
this.folder_icon.nativeElement.className = "glyphicon glyphicon-folder-open";
}
}

}

我不会为您提供样式表,因为这首先会完全矫枉过正,其次 css 很奇怪,每个人都有不同的解决方案。我相信您会弄清楚如何适本地设置组件的样式。

同样,不能保证所提议的代码在复制和粘贴后能够正常工作。原始项目变得庞大,其中包含许多您在用例中不需要的树功能。因此,可能存在一些您不需要的变量。

欢呼,祝您使用愉快。

关于Angular 4 - 带有子菜单下拉菜单的下拉菜单(多级),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46358779/

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