Search code examples
angulartypescriptmenusubmenu

How to create a "submenu" in a dynamic dropdown list with typescript and angular?


This is how I have created a dynamic dropdown list:

.html

<label> Move to </label>
    <select [(ngModel)] = "mSelectedCategoryNameMoveTo" 
            (click)     = "onMoveToSelected()" 
            [disabled]  = "mflagDisableMoveTo" >

        <option *ngFor = "let category of categories" [ngValue] = "category.name" >
            {{category.name}}
        </option>       

    </select>

Here the list categories is coming from .ts file. All the variables and the functions are defined in the corresponding .ts file.

The category structure .ts is as follows:

export interface CategoryStructure
{
    id:          number
    name:        string
    description: string 
    blogIds:     number[]
}

What would be the way to create a "submenu" here?

This is what a submenu looks like: enter image description here


Solution

  • Edit 2

    Another live demo menu-style-related:
    https://stackblitz.com/edit/angular-ivy-zrzfuy


    Edit

    Reactive Form Live Demo: https://stackblitz.com/edit/angular-ivy-fhvvzs


    This is an example of how to do it.

    File .html

    <select id="categoriesList" name="categoriesList" [ngModel]="categorySelected"
    (ngModelChange)="setAnotherSelect(+$event)">
        <option value="-1"></option>
        <option *ngFor="let category of categories" value="{{ category.id }}">{{ category.name }}</option>
    </select>
    
    <select id="randomElementsList" name="randomElementsList" [ngModel]="randomElements" *ngIf="showRandomElements">
        <option value="-1"></option>
        <option *ngFor="let element of randomElements" value="{{ element.id }}">{{ element.name }}</option>
    </select>
    

    File model.ts

    export interface ICategoryStructure
    {
        id: number;
        name: string;
        description: string;
        blogIds: number[];
    }
    

    File component.ts

    import { ICategoryStructure } from './myApp.model'
    
    public categories: ICategoryStructure[] = [
        { id: 1, name: 'test1', description: 'description1', blogIds: [1, 2] },
        { id: 2, name: 'test2', description: 'description2', blogIds: [3, 4] },
        { id: 3, name: 'test3', description: 'description3', blogIds: [5, 6] },
      ];
      public categorySelected: number = -1;
    
      public randomElements: ICategoryStructure[] = [];
      public randomElementSelected: number = -1;
      public showRandomElements = false;
    
      public setAnotherSelect(numberId) {
        this.categorySelected = numberId;
        this.showRandomElements = true;
        this.randomElements = [];
        switch (numberId) {
            case 1:
                this.randomElements = [
                  { id: 4, name: 'test4', description: 'description4', blogIds: [7, 8] },
                  { id: 5, name: 'test5', description: 'description5', blogIds: [9, 10] },
                  { id: 6, name: 'test6', description: 'description6', blogIds: [11, 12] },
                ];
                break;
            case 2:
                this.randomElements = [
                  { id: 7, name: 'test7', description: 'description7', blogIds: [13, 14] },
                  { id: 8, name: 'test8', description: 'description8', blogIds: [15, 16] },
                  { id: 9, name: 'test9', description: 'description9', blogIds: [17, 18] },
                ];
                break;
            case 3:
                this.randomElements = [
                  { id: 10, name: 'test10', description: 'description10', blogIds: [19, 20] },
                  { id: 11, name: 'test11', description: 'description11', blogIds: [21, 22] },
                  { id: 12, name: 'test12', description: 'description12', blogIds: [23, 24] },
                ];
                break;
            default:
                this.showRandomElements = false;
                break;
        }
      }
    

    Live demo here:
    https://stackblitz.com/edit/angular-ivy-hzee7k