Angular 탐색 서랍 구성요소 개요

    Ignite UI for Angular 측면 탐색 컨테이너입니다. 콘텐츠 위에 놓고 보기 안팎으로 슬라이드하거나 고정하여 콘텐츠 내에서 확장/축소할 수 있습니다. 미니 버전은 닫힌 상태에서도 탐색에 빠르게 액세스할 수 있습니다. Navigation Drawer는 반응형 모드 선택 및 터치 제스처 기능을 갖추고 있습니다. 콘텐츠는 완전히 사용자 정의 가능하며 기본 메뉴 항목 스타일을 사용할 수 있습니다.

    Angular Navigation Drawer Example

    Getting Started with Ignite UI for Angular Navigation Drawer

    Ignite UI for Angular Navigation Drawer 구성 요소를 시작하려면 먼저 Ignite UI for Angular 설치해야 합니다. 기존 Angular 애플리케이션에서 다음 명령을 입력합니다.

    ng add igniteui-angular
    

    Ignite UI for Angular에 대한 전체 소개를 보려면 시작하기 항목을 읽어보세요.

    첫 번째 단계는 IgxNavigationDrawerModule 우리 안에 app.module.ts 파일.

    Note

    또한 IgxNavigationDrawerComponent 터치 상호 작용에 따라 달라 BrowserAnimationsModule 지며 선택적으로​ ​HammerModule 터치 상호 작용에 따라 달라지므로 AppModule에도 추가해야 합니다.

    // app.module.ts
    ...
    import { HammerModule } from '@angular/platform-browser';
    import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
    import { IgxNavigationDrawerModule } from 'igniteui-angular';
    // import { IgxNavigationDrawerModule } from '@infragistics/igniteui-angular'; for licensed package
    
    @NgModule({
        ...
        imports: [..., BrowserAnimationsModule, HammerModule, IgxNavigationDrawerModule],
        ...
    })
    export class AppModule {}
    

    또는 16.0.0부터 IgxNavigationDrawerComponent를 독립 실행형 종속성으로 가져오거나 IGX_NAVIGATION_DRAWER_DIRECTIVES 토큰을 사용하여 구성 요소와 모든 지원 구성 요소 및 지시문을 가져올 수 있습니다.

    // home.component.ts
    
    import { HammerModule } from '@angular/platform-browser';
    import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
    import { NgFor } from '@angular/common';
    import { IGX_NAVIGATION_DRAWER_DIRECTIVES, IgxRippleDirective, IgxIconComponent } from 'igniteui-angular';
    // import { IGX_NAVIGATION_DRAWER_DIRECTIVES, IgxRippleDirective, IgxIconComponent } from '@infragistics/igniteui-angular'; for licensed package
    
    @Component({
        selector: 'app-home',
        template: `
        <div class="content-wrap">
            <igx-nav-drawer [isOpen]="true">
                <ng-template igxDrawer>
                    <nav>
                        <span igxDrawerItem [isHeader]="true">Components</span>
                        <span *ngFor="let item of navItems" igxDrawerItem [active]="item.text === selected" igxRipple (click)="navigate(item)">
                            <igx-icon fontSet="material">{{ item.name }}</igx-icon>
                            <span>{{ item.text }}</span>
                        </span>
                    </nav>
                </ng-template>
            </igx-nav-drawer>
            <main>
                <!-- app content -->
            </main>
        </div>
        `,
        styleUrls: ['home.component.scss'],
        standalone: true,
        imports: [BrowserAnimationsModule, HammerModule, IGX_NAVIGATION_DRAWER_DIRECTIVES, IgxRippleDirective, IgxIconComponent, NgFor]
        /* or imports: [BrowserAnimationsModule, HammerModule, IgxNavigationDrawerComponent, IgxNavDrawerTemplateDirective, IgxNavDrawerItemDirective, IgxIconComponent, IgxRippleDirective, NgFor] */
    })
    export class HomeComponent {
        public navItems: Product [];
    }
    

    이제 Ignite UI for Angular 가져왔으므로 igx-nav-drawer 구성 요소 사용을 시작할 수 있습니다.

    Using the Angular Navigation Drawer

    종속성을 가져오면 탐색 창을 앱 구성 요소 템플릿에 정의할 수 있습니다.

    <igx-nav-drawer id="navdrawer" [isOpen]="true">
        <!-- template(s) -->
    </igx-nav-drawer>
    

    서랍의 콘텐츠는 igxDrawer 지시문으로 장식된 <ng-template>을 통해 제공되어야 합니다. 템플릿에 모든 콘텐츠를 제공할 수 있지만 igxDrawerItem 지시어(항목 스타일 참조)를 사용하여 항목에 기본 스타일을 적용할 수 있습니다. 지시문에는 두 가지 @Input 속성이 있습니다.

    • 선택한 항목의 스타일을 지정하려면 active.
    • 항목의 스타일을 그룹 머리글로 지정하는 isHeader 활성화될 수 없습니다.

    igxRipple 지시어는 모양과 느낌을 완성합니다.

    <!-- app.component.html -->
    <div class="content-wrap">
      <igx-nav-drawer id="navigation" #drawer [isOpen]="true">
        <ng-template igxDrawer>
          <nav>
            <span igxDrawerItem [isHeader]="true">Components</span>
            <span *ngFor="let item of navItems" igxDrawerItem [active]="item.text === selected"
            igxRipple (click)="navigate(item)">
              <igx-icon fontSet="material">{{ item.name }}</igx-icon>
              <span>{{ item.text }}</span>
            </span>
          </nav>
        </ng-template>
      </igx-nav-drawer>
      <main>
        <!-- app content -->
      </main>
    </div>
    

    igxDrawerMini 지시문으로 장식된 추가 템플릿은 대체 Mini 변형에 대해 닫힌 상태로 제공될 수 있습니다.

    Note

    탐색 창은 콘텐츠 위에 떠 있거나 콘텐츠 옆에 고정될 수 있습니다. 기본적으로 서랍은 뷰포트 크기에 따라 해당 모드 간에 전환됩니다. 자세한 내용은 모드를 참조하세요.

    서랍 전환 모드를 수용하기 위해 두 콘텐츠 섹션 주위의 간단하고 유연한 래퍼 스타일을 다음과 같이 지정할 수 있습니다.

    /* app.component.css */
    .content-wrap
    {
        width: 100%;
        height: 100%;
        display: flex;
    }
    

    탐색 창에 요소를 추가하고 이를 선택할 수 있으려면 TypeScript 파일이 다음과 같아야 합니다.

    /* app.component.ts */
    @Component({...})
    export class AppComponent {
        public navItems = [
            { name: 'account_circle', text: 'Avatar' },
            ...
        ];
    
        public selected = 'Avatar';
    
        public navigate(item) {
            this.selected = item.text;
        }
    }
    

    서랍을 열고 닫는 방법은 다양합니다. 입력 속성은 앱 상태, @ViewChild(IgxNavigationDrawerComponent) 참조를 사용하는 구성 요소의 API에 대한 프로그래밍 방식 액세스 또는 이 경우 #drawer 템플릿 참조 변수를 사용하여 바인딩될 수 있습니다.

    <button (click)="drawer.toggle()"> Menu </button>
    

    Navigation Drawer는 igxNavigationService 와도 통합되며 igxToggleAction 지시문을 사용하여 id로 타겟팅할 수 있습니다.

    를 교체해 보겠습니다. <main> 안으로 app.component.html 다음과 같이 igxIconButton 그리고 Icon 구성 요소 토글의 스타일을 지정하려면:

    <main>
      <span igxIconButton="flat" igxToggleAction="navigation">
        <igx-icon fontSet="material">menu</igx-icon>
      </span>
    </main>
    

    또한 항목을 선택할 때 서랍을 닫으려면 다음과 같이 @ViewChild(IgxNavigationDrawerComponent) 참조를 사용할 수 있습니다.

    /* app.component.ts */
    import { Component, ViewChild } from '@angular/core';
    import { IgxNavigationDrawerComponent } from 'igniteui-angular';
    // import { IgxNavigationDrawerComponent } from '@infragistics/igniteui-angular'; for licensed package
    
    @Component({...})
    export class AppComponent  {
        @ViewChild(IgxNavigationDrawerComponent, { static: true })
        public drawer: IgxNavigationDrawerComponent;
    
        // And of course add the key line to our navigate function
    
        public navigate(item) {
            this.selected = item.text;
            this.drawer.close();
        }
    }
    

    모든 것이 순조롭게 진행되었다면 브라우저에 데모 샘플이 표시될 것입니다.

    Modes

    고정 해제(콘텐츠 위로 올라감) 모드는 서랍이 위에 위치하여 콘텐츠 위에 어두운 오버레이를 적용하는 일반적인 동작입니다. 일반적으로 모바일 장치에 적합한 임시 탐색을 제공하는 데 사용됩니다.

    서랍을 고정하여 더 큰 화면을 활용하고 상대적인 위치에 따라 정상적인 콘텐츠 흐름 내에 배치할 수 있습니다. 앱이 서랍을 전환하는 방법을 제공하는지 여부에 따라 고정 모드를 사용하여 영구적 또는 지속적인 동작을 달성할 수 있습니다.

    Note

    기본적으로 탐색 창은 반응형이며 화면 크기에 따라 고정 해제 모드와 고정 모드 사이를 능동적으로 변경합니다. 이 동작은 pinThreshold 속성에 의해 제어되며 잘못된 값(예: 0)을 설정하여 비활성화할 수 있습니다.

    Pinned (persistent) setup

    핀은 서랍의 위치를 fixed에서 relative 변경하여 콘텐츠와 동일한 흐름에 배치합니다. 따라서 앱 스타일은 특히 이 모드에서 서랍을 전환해야 하는 경우 이러한 레이아웃을 고려해야 합니다. 이러한 유연한 레이아웃(프로그래밍 방식 포함)을 달성하는 방법은 여러 가지가 있지만 가장 쉬운 방법은 igxLayoutigxFlex 지시문을 사용하는 것입니다.

    이전 예에 적용된 모습은 다음과 같습니다.

    <div class="content-wrap" igxLayout igxLayoutDir="row">
        <igx-nav-drawer id="navigation" #drawer [isOpen]="true" [pin]="true" [pinThreshold]="0">
            <!-- template(s) -->
        </igx-nav-drawer>
        <main igxFlex>
            <!-- content here -->
        </main>
    </div>
    
    .content-wrap {
        width: 100%;
        position: absolute;
        top: 0;
        right: 0;
        bottom: 0;
        left: 0;
    }
    

    이제 변경된 예는 다음과 같아야 합니다.

    서랍은 호스트 요소에 flex-basis 적용하여 나머지 콘텐츠가 나머지 너비를 차지할 수 있도록 합니다. 또는 다음과 유사하게 지시어를 사용하여 건너뛰고 수동 스타일을 적용할 수 있습니다.

    .main {
        position: absolute;
        display: flex;
        flex-flow: row nowrap;
        top: 0;
        right: 0;
        bottom: 0;
        left: 0;
        width: 100%;
    }
    
    .main > * {
        width: 100%;
    }
    

    Mini variant

    미니 변형을 사용하면 탐색 서랍이 닫히는 대신 너비가 변경됩니다. 아이콘만 남겨두고 항상 측면에서 빠른 선택이 가능하도록 유지하는 데 가장 일반적으로 사용됩니다. 이 변형은 igxDrawerMini 지시문으로 장식된 대체 미니 템플릿이 있으면 간단히 활성화됩니다.

    미니 변형은 일반적으로 영구 설정에 사용되므로 pin 설정하고 응답 임계값을 비활성화했습니다.

    <igx-nav-drawer id="navigation" [pin]="true" [pinThreshold]="0">
        <ng-template igxDrawer>
            <span *ngFor="let item of navItems" igxDrawerItem [active]="item.text === selected" igxRipple (click)="navigate(item)">
              <igx-icon fontSet="material">{{ item.name }}</igx-icon>
              <span>{{ item.text }}</span>
            </span>
        </ng-template>
        <ng-template igxDrawerMini>
            <span *ngFor="let item of navItems" igxDrawerItem [active]="item.text === selected" igxRipple (click)="navigate(item)">
                <igx-icon fontSet="material">{{ item.name }}</igx-icon>
            </span>
        </ng-template>
    </igx-nav-drawer>
    

    Using Angular Router

    Angular Router를 사용하려면 먼저 @angular/router에서 git을 가져와서 생성자에서 라우터 인스턴스를 만들어야 합니다. 그런 다음 링크 값에 대한 라우터를 사용하여 탐색 항목을 정의해야 합니다.

    /* app.component.ts */
     ...
    
    export class AppComponent {
        public componentLinks = [
            {
                link: 'avatar',
                name: 'Avatar'
            },
            {
                link:  'badge',
                name: 'Badge'
            },
            {
                link:  'button-group',
                name: 'Button Group'
            }
        ];
    }
    

    템플릿 변수에 할당된 routerLinkActive 사용할 수 있으며 isActive 속성을 사용하여 igxDrawerItemactive 입력에 바인딩할 수 있습니다. <igx-nav-drawer> 템플릿은 다음과 같습니다.

    /* app.component.html */
    
    <!-- ... -->
    <ng-template igxDrawer>
        <nav>
            <span igxDrawerItem [isHeader]="true">Components</span>
    
            <span *ngFor="let item of componentLinks" routerLink="{{item.link}}"
                routerLinkActive #rla="routerLinkActive"
                igxDrawerItem igxRipple [active]="rla.isActive">
                    {{item.name}}
            </span>
        </nav>
    </ng-template>
    <!-- ... -->
    

    마지막으로 app.module.ts 파일의 항목 경로와 함께 RouterModule을 가져옵니다.

    /*app.module.ts*/
    import { RouterModule } from '@angular/router';
    
    @NgModule([
        imports: [
            RouterModule,
    		RouterModule.forRoot([
                {path: 'avatar', component: NavDrawerRoutingComponent},
                {path: 'badge', component: NavDrawerRoutingComponent},
                {path: 'button-group', component: NavDrawerRoutingComponent}
            ])
        ]
    ])
    

    위의 모든 단계가 완료되면 앱은 다음과 같이 표시됩니다.

    Hierarchical Navigation

    다음을 사용하여 다단계 계층 탐색을 생성하려면 IgxNavigationDrawerComponent, 당신은 IgxTree구성 요소에서 igxDrawer 주형. 트리는 애플리케이션에서 직접 구성할 수 있습니다. Routes 물체. 이를 달성하는 방법은 다음과 같습니다.

    <igx-nav-drawer [isOpen]="true" [enableGestures]="true" width="280px">
        <ng-template igxDrawer>
            <igx-tree>
                <igx-tree-node *ngFor="let route of routes">
                    <a igxTreeNodeLink [routerLink]="route.path" routerLinkActive="route-selected-class">{{ route.data?.displayName }}</a>
                    <igx-tree-node *ngFor="let child of route.children">
                        <a igxTreeNodeLink [routerLink]="[route.path, child.path]" routerLinkActive="route-selected-class">{{ child.data?.displayName }}</a>
                    </igx-tree-node>
                </igx-tree-node>
            </igx-tree>
        </ng-template>
    </igx-nav-drawer>
    
    Note

    이 예에서는 igxDrawerItem 사용하지 않고 대신 사용자 정의 igxDrawer 콘텐츠(이 경우 igx-tree를 사용하여 직접 채웁니다.

    import { menusRoutes } from '../../menus-routing.module';
    
    @Component({
      selector: 'app-nav-drawer-hierarchical',
      templateUrl: './nav-drawer-hierarchical.component.html',
      styleUrls: ['./nav-drawer-hierarchical.component.scss']
    })
    export class NavDrawerHierarchicalComponent {
        public routes = menusRoutes;
    }
    

    이 예에서는 igx-tree 노드의 링크 텍스트를 시각화하는 데 사용되는 displayName 속성이 포함된 사용자 지정 라우팅 data로 경로를 채웁니다. 샘플 Route 다음과 같습니다.

    export const menusRoutes: Routes = [
        {
            component: NavDrawerHierarchicalComponent,
            path: 'navigation-drawer-hierarchical',
            data: { displayName: 'Hierarchical Drawer Menu' }
        }
    ];
    

    경로의 children 속성에서 추출된 하위 라우팅도 있습니다. 샘플은 두 가지 수준의 계층 구조를 보여 주지만 라우팅에 더 많은 계층이 있는 경우 트리 노드 템플릿에서 두 번째 계층 아래 수준을 정의하기만 하면 됩니다.

    Note

    빈 경로 리디렉션, 오류 경로, 페이지를 찾을 수 없음 등과 같은 일부 경로는 직접 시각화에 적합하지 않을 수 있습니다. 트리를 라우팅 개체에 바인딩하기 전에 구성 요소 논리의 개체에서 해당 경로를 제거할 수 있습니다.

    아래 예에서는 주제 이름 및 링크와 함께 사전 정의된 데이터를 사용하여 계층 구조의 기능을 보여줍니다. 이 구조를 통해 사용자는 기능적이고 자세한 탐색을 쉽게 생성할 수 있으며 각 요소를 링크로 표시할지 표시기로 표시할지 정의할 수 있습니다.

    스타일링

    탐색 창 스타일 지정을 시작하려면 모든 테마 기능과 구성 요소 믹스인이 있는 index 파일을 가져와야 합니다.

    @use "igniteui-angular/theming" as *;
    
    // IMPORTANT: Prior to Ignite UI for Angular version 13 use:
    // @import '~igniteui-angular/lib/core/styles/themes/index';
    

    가장 간단한 접근 방식에 따라 navdrawer-theme 확장하고 navdrawer 항목의 스타일을 지정하는 몇 가지 매개 변수를 허용하는 새 테마를 만듭니다.

    $custom-theme: navdrawer-theme(
        $background: #2d313a,
        $item-active-background: #ecc256,
        $item-header-text-color: #ecc256
    );
    

    표시된 것처럼 navdrawer-theme 해당 항목의 기본 스타일을 지정하는 데 유용한 몇 가지 매개변수를 노출합니다.

    Including themes

    마지막 단계는 애플리케이션에 구성 요소 테마를 포함하는 것입니다.

    $legacy-support​ ​true로 설정된 경우 다음과 같은 구성 요소 테마를 포함합니다.

     @include navdrawer($custom-theme);
    
    Note

    구성 요소가 Emulated ViewEncapsulation을 사용하는 경우::ng-deep 사용하여 이 캡슐화를 penetrate 해야 합니다.

    :host {
         ::ng-deep {
            @include navdrawer($custom-theme);
        }
    }
    

    $legacy-support​ ​false (기본값)로 설정된 경우 다음과 같은 구성 요소 CSS 변수를 포함합니다.

    @include css-vars($custom-theme);
    
    Note

    구성 요소가 Emulated ViewEncapsulation을 사용하는 경우 변수를 재정의하려면 전역 선택기가 필요하므로 여전히:host 사용해야 합니다.

    :host {
        @include css-vars($custom-theme);
    }
    

    API and Style References