Angular материал stepper: отключить навигацию заголовка
Я хочу перемещаться по степперу только через кнопки "Вперед" и "Назад".
Я не могу заставить это работать, так как пользователи могут также щелкнуть ярлык каждого шага, чтобы перейти к любому шагу. Я не могу использовать линейный, так как для каждого шага требуется formArray
или FormGroup
.
Я пытался <mat-step (click)="$event.stopPropagation()">
.
Ответы
Ответ 1
Добавьте это к вашей таблице стилей. Я пытался отключить навигацию заголовка. Многое перепробовал, но этот хак сработал. Вы можете попробовать это, пока Angular Material Team не поддержит эту функцию.
::ng-deep .mat-horizontal-stepper-header{
pointer-events: none !important;
}
Ответ 2
Используйте степпер linear
с шагами completed=false
. Когда пользователь нажмет вашу кнопку, программно завершите шаг и перейдите к следующему.
Таким образом, вам не нужно связываться с событиями указателя CSS. В нашем приложении это привело к проблемам с доступностью NVDA.
<mat-horizontal-stepper linear #stepper>
<mat-step completed="false">
<ng-template matStepLabel>Step 1</ng-template>
<app-some-child (nextClicked)="nextClicked($event)" ></app-some-child>
</mat-step>
<mat-step>
<ng-template matStepLabel>Step 2</ng-template>
<app-some-other-child></app-some-other-child>
</mat-step>
</mat-horizontal-stepper>
export class AppComponent implements OnInit {
@ViewChild('stepper') stepper: MatStepper;
nextClicked(event) {
// complete the current step
this.stepper.selected.completed = true;
// move to next step
this.stepper.next();
}
}
Ответ 3
Не работает без :: ng-deep
::ng-deep .mat-horizontal-stepper-header{
pointer-events: none !important;
}
Ответ 4
Просто для улучшения принятого ответа, так как он не будет работать, если у вас есть вертикальный шаговый двигатель.
Чтобы пользователь не мог щелкнуть заголовок и перейти, добавьте следующий код в файл style.css в корневом каталоге: -
.mat-step-header {
pointer-events: none !important;
}
Это обеспечит его работу для mat-horizontal-stepper-header
и mat-vertical-stepper-header
Ответ 5
Я нашел для этого несколько хакерских решений. Проблема в том, что вы не можете полностью отключить навигацию заголовка, но вы можете не допустить ее активации до определенного момента.
И этот момент form.invalid
.
Моей ситуацией было следующее: пользователю нужно заполнить форму внутри шага, нажать "сохранить" и только после этого использовать кнопку NEXT
и еще дальше перемещаться по шагу (также обратно).
Что я сделал, так это ввести другой hidden
input
, который будет использовать динамический атрибут angular [required]
. Это будет только required
, если предыдущее условие save
не было успешным. Как только это произойдет, это поле не будет required
, и пользователь сможет перемещаться дальше.
Вместе с атрибутом mat-stepper (или md-stepper) editable
вы сможете достичь того, что хотите.
Сообщите мне, если вы полностью поняли эту идею.
Ответ 6
Здесь ::ng-deep .mat-horizontal-stepper-header-container {
display: none ;
}
Используйте это в своей таблице стилей, чтобы удалить шаговый заголовок... Как Шаг-1, Шаг-2
Ответ 7
Сначала вам нужно добавить ViewEncapsulation.None
в конфигурацию вашего компонента
@Component({
selector: 'app-example',
encapsulation: 'ViewEncapsulation.None'
})
Затем добавьте это в свой компонент CSS.
.mat-horizontal-stepper-header-container {
display: none !important;
}
Ответ 8
Не используйте :: ng-deep, поскольку он устарел.
https://angular.io/guide/component-styles#deprecated-deep--and-ng-deep
Вместо этого, если вы используете Angular Material, используйте руководство по темам из документации.
https://material.angular.io/guide/theming
Пример реализации стиля:
мой обычай-elements.scss
@import '[email protected]/material/theming';
@mixin custom-stepper-theme() {
.mat-horizontal-stepper-header {
pointer-events: none;
}
}
глобального материала-theme.scss
@import '[email protected]/material/theming';
// Plus imports for other components in your app.
// Include the common styles for Angular Material. We include this here so that you only
// have to load a single css file for Angular Material in your app.
// Be sure that you only ever include this mixin once!
@include mat-core();
@import './material/my-custom-elements.scss';
@include custom-stepper-theme();
angular.json
...
"styles": ["src/styles.scss", "src/app/global-material-theme.scss"]
...
Ответ 9
Вам нужно добавить "линейный" атрибут (это отключит навигацию)
<mat-vertical-stepper linear>
Ответ 10
В тег добавьте [linear] = "true"
<mat-horizontal-stepper labelPostion="botton" [linear]="true">
...
</mat-horizontal-stepper>