Angular 6, как сделать все элементы ввода не редактируемыми внутри формы - PullRequest
0 голосов
/ 25 июня 2018

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

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

@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>

Ответы [ 5 ]

0 голосов
/ 26 июня 2018

Поскольку атрибут disabled не работает на некоторых компонентах, я сделал следующее: я установил pointer-events: none на css, чтобы охватить все компоненты внутри divcontent.

Вот мой код CSS:

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

Вот мой HTML:

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

И на моем TS:

editData() {
    this.isActiveDiv = true;
  }
0 голосов
/ 25 июня 2018

Отключено и не доступно для редактирования - это не обязательно одно и то же. Отключенный ввод, конечно же, также не редактируется, но он имеет отчетливый вид - выделен серым цветом и выглядит «отключенным». Вход только для чтения выглядит так же, как обычный вход, но не редактируется. Таким образом, вы должны спросить, хотите ли вы, чтобы ваши элементы управления были фактически отключены или только для чтения. Похоже, вы просто хотите только для чтения. Для этого вам просто нужно использовать свойство 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>
0 голосов
/ 25 июня 2018

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

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

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

this.leaseholderForm.disable()

0 голосов
/ 25 июня 2018

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

           <mat-form-field>
                <input matInput upperCaseInput placeholder="Nom d'usage" formControlName="lastName" disable>
            </mat-form-field>
0 голосов
/ 25 июня 2018

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

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

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

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

this.formGroupName.disable()

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...