Angular 6, как сделать все элементы ввода не редактируемыми внутри формы

Есть ли способ отключить и сделать все поля не редактируемый(input / mat-select / textfield / option/input/mat-checkbox etc) внутри формы

сообщая только имя родительского div в Angular / Angular-material? (не могу их редактировать)

@Component({
  templateUrl: './leaseholder.component.html'
})
export class LeaseholderComponent implements OnInit, IFormDirtyWarningComponent {

  leaseholderForm: FormGroup;

  constructor(private router: Router, private formBuilder: FormBuilder) {
    this.createLeaseholderForm();
  }

  createLeaseholderForm() {
    this.leaseholderForm = this.formBuilder.group({
      civility: [this.identityModel.civility],
      firstName: [this.identityModel.firstName, Validators.compose([Validators.pattern("[^\\d]+")])],
      lastName: [this.identityModel.lastName, Validators.compose([Validators.pattern("[^\\d]+")])],
      birthName: [this.identityModel.birthName, Validators.compose([Validators.pattern("[^\\d]+")])],
      birthDate: [this.identityModel.birthDate],
      birthPlace: [this.identityModel.birthPlace, Validators.compose([Validators.pattern("[^\\d]+")])],
      nationality: ['FR', this.identityModel.nationality],
      endOfStay: [this.identityModel.endOfStay]
    });
  }

    <form [formGroup] = "leaseholderForm" (ngSubmit) = "onSubmit()">
                <div class = "mat-radio-group-inverted">
                    <mat-radio-group formControlName = "civility">
                        <mat-radio-button color = "primary" value = "MR">M.</mat-radio-button>
                        <mat-radio-button color = "primary" value = "MME">MME.</mat-radio-button>
                    </mat-radio-group>
                </div>
                <mat-form-field>
                    <input matInput upperCaseInput placeholder = "Nom d'usage" formControlName = "lastName">
                </mat-form-field>
...........................
..........  example
    </form>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
14
0
72 667
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

Если вы используете реактивную форму, вы можете достичь этого программно следующим образом (подход по одному):

 this.formGroupName.controls[controlNmae].disable();

Например: this.formGroupName.controls['lastName'].disable()

Чтобы отключить все сразу:

this.formGroupName.disable()

В вашем случае: this.leaseholderForm.disable()
А чтобы повернуть обратно, сделайте: this.leaseholderForm.enable()

Что вы можете сделать, так это создать такую ​​функцию и вызвать ее после вызова createLeaseholderForm():

disableForm() {
 this.leaseholderForm.disable()
}  

для получения дополнительной информации прочтите это.

Я согласен. Это должно работать, как показано здесь. @AnouarMokhtari - В консоли нет ошибки?

ConnorsFan 25.06.2018 19:09

Имейте в виду, что отключенный <input> не отправляется с формой, а <input> только для чтения.

JWess 12.02.2019 17:55

Буэнасо! это то что мне нужно! Спасибо!

dmarquina 14.05.2019 03:59

Создайте FormGroup, как описано здесь:

https://angular.io/guide/reactive-forms#add-a-formgroup

Затем программно возьмите экземпляр formGroup и вызовите на нем .disable(), например:

this.leaseholderForm.disable()

да, использую реактивную форму, обновляю выпуск. .disable () не работает

Anouar Mokhtari 25.06.2018 18:14

можете ли вы предоставить код вашего контроллера компонента?

ggradnig 25.06.2018 18:17

Готово, я не уверен, что .disable () превратит все поля формы в недоступные для редактирования, я думаю, что отключить элемент управления формой

Anouar Mokhtari 25.06.2018 18:28

Используйте атрибут disable в шаблоне html.

           <mat-form-field>
                <input matInput upperCaseInput placeholder = "Nom d'usage" formControlName = "lastName" disable>
            </mat-form-field>

Свойство disabled не следует использовать с элементами ввода в реактивных формах Angular. Вместо этого следует отключить элемент управления формой: control = new FomrControl({'value', disabled: true}, [validators]);

G. Tranter 25.06.2018 20:40

Отключено и недоступно для редактирования - не обязательно одно и то же. Отключенный ввод, конечно, также нельзя редактировать, но он имеет отчетливый вид - серый и выглядит «отключенным». Вход только для чтения выглядит так же, как обычный вход, но не редактируется. Поэтому вы должны спросить, действительно ли вы хотите, чтобы ваши элементы управления были отключены или только для чтения.

Если вы хотите только для чтения, вы можете просто использовать свойство readonly для <input> и привязать его к переменной в вашем контроллере. Например:

export class LeaseholderComponent implements OnInit, IFormDirtyWarningComponent {

    @Input() editable: boolean = false; // doesn't have to be an @Input
    ...
}

<form [formGroup] = "leaseholderForm" (ngSubmit) = "onSubmit()">
    <mat-form-field>
        <input matInput [readonly] = "!editable" upperCaseInput placeholder = "Nom d'usage" formControlName = "lastName">
    </mat-form-field>
    ...
</form>

Обратите внимание, что свойство editable не обязательно должно быть @Input, но это может быть полезно, если вы используете форму в качестве повторно используемого компонента и вам нужно принять решение о редактировании / доступе только для чтения на уровне DOM.

Для других компонентов, таких как переключатели, для которых свойство readonly недоступно, вам, вероятно, следует переосмыслить компоновку. Возможно, имеет смысл использовать другой компонент для отображения параметра радио в режиме только для чтения, а не полный список параметров. Например, используйте пару метка и значение:

<div *ngIf = "editable; else readonlyRadio" class = "mat-radio-group-inverted">
    <mat-radio-group formControlName = "civility">
        <mat-radio-button color = "primary" value = "MR">M.</mat-radio-button>
        <mat-radio-button color = "primary" value = "MME">MME.</mat-radio-button>
    </mat-radio-group>
</div>
<div #readonlyRadio>
    <label>Civility</label>
    <span>{{ leaseholderForm.controls['civility'].value }}</span>
</div>

Это лучшее решение, так как оно не помечает поле как недействительное.

Gabb1995 25.03.2019 11:56

Поскольку атрибут отключен не работает с некоторыми компонентами, я сделал следующее: я установил указатель-события: нет в css, чтобы охватить все компоненты внутри содержимого div.

Вот мой код CSS:

.disabledDiv {
      pointer-events: none;
      opacity: 0.4;   }

Вот мой HTML:

<div class = "content-area" [ngClass] = "{disabledDiv: !isActiveDiv}"> 
    <!-- other components here (input/select/etc.) -->
<div> 

И на моем ТС:

editData() {
    this.isActiveDiv = true;
  }

Не знаком с событиями указателя. Но предотвращает ли это и табуляцию?

Ian Grainger 14.10.2020 19:30

Используйте атрибут readonly в файле HTML внутри тега input.

Старайтесь не использовать изображения кода для ответа на вопросы - код - это текст, почему бы не опубликовать его как таковой?

ross 12.09.2019 11:53
this.formGroupName.controls['lastName'].disable()

У меня не сработало в Angular 8. Я заставил его работать, добавив атрибут «только для чтения» внутри HTML, а затем изменив его значение в файле .ts.

внутри файла .html

 <input formControlName = "email" matInput type = "email" #email email = "true" [readonly] = "email_readonly" />

внутри файла .ts

email_readonly = false;

yourFunction()
{
  this.email_readonly = true;
}

Другие вопросы по теме