Как программно переключать панель расширения углового материала

Я только начал работать над проектом Angular 4 с материальным дизайном.

В настоящее время я работаю с компонентом расширения, API заявляет, что отключенная панель расширения не может переключаться пользователем, но все же может управляться программно. Однако я не знаю, как вы можете программно переключать панель.

Каков предпочтительный способ моделирования в Angular?

3 ответа

Решение

extended установлен на true, чтобы развернуть панель расширения, и на false, чтобы закрыть панель расширения. В следующем примере панель расширения программно открывается и закрывается. Пожалуйста, обратитесь по этой ссылке

Файл TS

import {Component} from '@angular/core';

/**
 * @title Expansion panel as accordion
 */
@Component({
  selector: 'expansion-steps-example',
  templateUrl: 'expansion-steps-example.html',
  styleUrls: ['expansion-steps-example.css']
})
export class ExpansionStepsExample {
  step = 0;

  setStep(index: number) {
    this.step = index;
  }

  nextStep() {
    this.step++;
  }

  prevStep() {
    this.step--;
  }
}

HTML-файл

<mat-accordion class="example-headers-align">
  <mat-expansion-panel [expanded]="step === 0" (opened)="setStep(0)" hideToggle="true">
    <mat-expansion-panel-header>
      <mat-panel-title>
        Personal data
      </mat-panel-title>
      <mat-panel-description>
        Type your name and age
        <mat-icon>account_circle</mat-icon>
      </mat-panel-description>
    </mat-expansion-panel-header>

    <mat-form-field>
      <input matInput placeholder="First name">
    </mat-form-field>

    <mat-form-field>
      <input matInput type="number" min="1" placeholder="Age">
    </mat-form-field>

    <mat-action-row>
      <button mat-button color="primary" (click)="nextStep()">Next</button>
    </mat-action-row>
  </mat-expansion-panel>

  <mat-expansion-panel [expanded]="step === 1" (opened)="setStep(1)" hideToggle="true">
    <mat-expansion-panel-header>
      <mat-panel-title>
        Destination
      </mat-panel-title>
      <mat-panel-description>
        Type the country name
        <mat-icon>map</mat-icon>
      </mat-panel-description>
    </mat-expansion-panel-header>

    <mat-form-field>
      <input matInput placeholder="Country">
    </mat-form-field>

    <mat-action-row>
      <button mat-button color="warn" (click)="prevStep()">Previous</button>
      <button mat-button color="primary" (click)="nextStep()">Next</button>
    </mat-action-row>
  </mat-expansion-panel>

  <mat-expansion-panel [expanded]="step === 2" (opened)="setStep(2)" hideToggle="true">
    <mat-expansion-panel-header>
      <mat-panel-title>
        Day of the trip
      </mat-panel-title>
      <mat-panel-description>
        Inform the date you wish to travel
        <mat-icon>date_range</mat-icon>
      </mat-panel-description>
    </mat-expansion-panel-header>

    <mat-form-field>
      <input matInput placeholder="Date" [matDatepicker]="picker" (focus)="picker.open()" readonly>
    </mat-form-field>
    <mat-datepicker #picker></mat-datepicker>

    <mat-action-row>
      <button mat-button color="warn" (click)="prevStep()">Previous</button>
      <button mat-button color="primary" (click)="nextStep()">End</button>
    </mat-action-row>
  </mat-expansion-panel>

</mat-accordion>

Еще один очень простой способ обрабатывать панель Mat Expansion программно - использовать локальные ссылки в Angular.

<mat-accordion>
  <mat-expansion-panel #mep="matExpansionPanel">
  </mat-expansion-panel>
</mat-accordion>

Теперь в HTML(файл недоступен непосредственно в файле TS, пока мы не используем @ViewChild), используйте mep, чтобы развернуть или свернуть панель расширения, используя что-то вроде этого:

<button (click)="mep.expanded = true;">Expand</button>
<button (click)="mep.expanded = false;">Collapse</button> 

Простая реализация для массива панелей

<mat-expansion-panel [expanded]="indexExpanded == i" disabled="true" *ngFor="...; let i = index">
    ...
    <button (click)="togglePanels(i)">Toggle</button>
    ...
</mat-expansion-panel>

И в коде

indexExpanded: number = -1;

togglePanels(index: number) {
    this.indexExpanded = index == this.indexExpanded ? -1 : index;
}

Вы можете установить переменную, в этом случае я использовал isExpanded, а затем использовал ее для открытия и закрытия, чтобы установить логическое значение.

<mat-expansion-panel
  *ngIf="advertisements.objs"
  [expanded]="isExpanded"
>
</mat-expansion-panel>

Если вы хотите использовать его со встроенной кнопкой toogle, вместо этого вы должны обновить переменную isExpanded с помощью хуков "(open)" и "(closed)" из mat-extension-panel.

<mat-expansion-panel
      *ngIf="advertisements.objs"
      [expanded]="isExpanded"
      (opened)="isExpanded = true"
      (closed)="isExpanded = false"
>
</mat-expansion-panel>

app.component.html:

    <button (click)='xpandStatus=xpandStatus?false:true'>Toggle it</button>
    <p>
    <mat-expansion-panel [(expanded)]="xpandStatus">
      <mat-expansion-panel-header>
        <mat-panel-title>This an expansion panel</mat-panel-title>
        <mat-panel-description>xpandStatus is {{xpandStatus}}</mat-panel-description>
      </mat-expansion-panel-header>
      Two-way binding on the expanded attribute gives us a way to store and manipulate the expansion status.
    </mat-expansion-panel>
    </p>

app.component.ts

import { Component } from '@angular/core';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  xpandStatus=true;
}

Вот это в StackBlitz: https://stackblitz.com/edit/angular-gtsqg8

Предположим, вы ищете способ вызвать метод open() из компонента при нажатии кнопки, это то, что я смог получить из документации API материалов.

import { MatAccordion, MatExpansionPanel } from '@angular/material/expansion';

export class MyComponent implements OnInit {
  @ViewChild(MatExpansionPanel) pannel?: MatExpansionPanel; 
  @ViewChild(MatAccordion) accordion?: MatAccordion;

constructor(){}

  closePannel() { // for expansion panel only
    if(!this.pannel) { return }
    this.pannel.close();
  }

  closeAll() { // for all panels in accordion
    if(!this.accordion) { return }
    this.accordion.closeAll();
  }
}
Другие вопросы по тегам