Tắt các trường nhập ở dạng phản ứng


117

Tôi đã thử làm theo ví dụ về các câu trả lời khác từ đây và tôi đã không thành công!

Tôi đã tạo một biểu mẫu phản ứng (tức là động) và tôi muốn tắt một số trường vào bất kỳ thời điểm nào. Mã biểu mẫu của tôi:

this.form = this._fb.group({
  name: ['', Validators.required],
  options: this._fb.array([])
});

const control = <FormArray>this.form.controls['options'];
control.push(this._fb.group({
  value: ['']
}));

html của tôi:

<div class='row' formArrayName="options">
  <div *ngFor="let opt of form.controls.options.controls; let i=index">
    <div [formGroupName]="i">
      <select formArrayName="value">
        <option></option>
        <option>{{ opt.controls.value }}</option>
      </select>
    </div>
  </div>
</div>

Tôi đã giảm mã để tạo điều kiện. Tôi muốn tắt trường loại chọn. Tôi đã cố gắng làm như sau:

form = new FormGroup({
  first: new FormControl({value: '', disabled: true}, Validators.required),
});

không làm việc! Còn ai có đề nghị nào không?


Làm thế nào có thể các chọn bị vô hiệu, khi bạn đang cố gắng để vô hiệu hóa một số formcontrol gọi là first':)?
AJT82

Nó chỉ là lỗi đánh máy. Tôi muốn tắt lựa chọn. Bạn có thể giúp tôi được không?
Renato Souza de Oliveira

Bạn có thể tái tạo một plunker?
AJT82

Bạn đang cố vô hiệu hóa toàn bộ lựa chọn? Và valuekhông phải là formArray, mà là formControlName. Nếu bạn muốn valuetrở thành một formArray, bạn sẽ phải thay đổi nó. Hiện tại nó là một formControlName. Vì vậy, nếu bạn muốn toàn bộ chọn lĩnh vực bị vô hiệu, chỉ cần thay đổi <select formArrayName="value">để<select formControlName="value">
AJT82

Câu trả lời:


222
name: [{value: '', disabled: true}, Validators.required],
name: [{value: '', disabled: this.isDisabled}, Validators.required],

hoặc là

this.form.controls['name'].disable();

nếu tôi đặt một giá trị như vậy -> country: [{value: this.address.country, disable: true}] thì giá trị không điền
Silvio Troia

Tôi đã sử dụng kỹ thuật tương tự để vô hiệu hóa các trường được điền tự động từ các nguồn đáng tin cậy. Tôi có một công tắc để bật / tắt biểu mẫu và sau khi bật toàn bộ biểu mẫu, tôi thường tắt các trường đó bằng cách sử dụng ifcâu lệnh. Sau khi biểu mẫu được gửi, toàn bộ biểu mẫu bị vô hiệu hóa một lần nữa.
retr0

72

Chú ý

Nếu bạn đang tạo một biểu mẫu bằng cách sử dụng một biến cho điều kiện và cố gắng thay đổi nó sau đó, nó sẽ không hoạt động, tức là biểu mẫu sẽ không thay đổi .

Ví dụ

this.isDisabled = true;

this.cardForm = this.fb.group({
    'number': [{value: null, disabled: this.isDisabled},
});

và nếu bạn thay đổi biến

this.isDisabled = false;

hình thức sẽ không thay đổi. Bạn nên sử dụng

this.cardForm.get ('number'). disable ();

BTW.

Bạn nên sử dụng phương thức patchValue để thay đổi giá trị:

this.cardForm.patchValue({
    'number': '1703'
});

22

Việc sử dụng vô hiệu hóa trong DOM với các biểu mẫu phản ứng là một thực tiễn không tốt. Bạn có thể đặt tùy chọn này trong của bạn FormControl, khi bạn bắt đầu từ

username: new FormControl(
  {
    value: this.modelUser.Email,
    disabled: true
  },
  [
    Validators.required,
    Validators.minLength(3),
    Validators.maxLength(99)
  ]
);

Tài sản valuekhông cần thiết

Hoặc bạn có thể kiểm soát biểu mẫu của mình với get('control_name')và đặtdisable

this.userForm.get('username').disable();

Tại sao sử dụng disable trong DOM với các biểu mẫu phản ứng lại là một phương pháp không tốt?
pumpkinthehead

2
Bạn sẽ nhận được một cảnh báo từ góc độ. It looks like you’re using the disabled attribute with a reactive form directive. If you set disabled to true when you set up this control in your component class, the disabled attribute will actually be set in the DOM for you. We recommend using this approach to avoid ‘changed after checked’ errors. Vì vậy, cách được đề xuất để thay đổi trạng thái tắt / bật trực tiếp thông qua điều khiển. Ngoài ra, bạn có thể kiểm tra chủ đề tuyệt vời này netbasal.com/…
Volodymyr Khmil

10

Tôi đã giải quyết nó bằng cách gói đối tượng đầu vào của mình với nhãn của nó trong một tập trường: Tập trường phải có thuộc tính bị vô hiệu hóa được liên kết với boolean

 <fieldset [disabled]="isAnonymous">
    <label class="control-label" for="firstName">FirstName</label>
    <input class="form-control" id="firstName" type="text" formControlName="firstName" />
 </fieldset>

1
lãng phí rất nhiều thời gian để tìm ra cách tắt các điều khiển trong các biểu mẫu phản ứng, LOL! điều này đã hoạt động .. không cần chỉ thị hoặc mã bổ sung. chúc mừng 🍻
Nexus

7

Các disablingFormControl preventsnó có mặt trong một hình thức trong khi saving. Bạn chỉ có thể đặt nó là thuộc readonlytính.

Và bạn có thể đạt được nó theo cách này:

HTML:

<select formArrayName="value" [readonly] = "disableSelect">

TS:

this.disbaleSelect = true;

Tìm thấy cái này ở đây


2
Bạn có thể sử dụng form.getRawValue()để bao gồm các giá trị điều khiển bị vô hiệu hóa
Murhaf Sousli

6

Nếu để sử dụng disabledcác yếu tố đầu vào biểu mẫu (như được đề xuất trong câu trả lời đúng cách tắt tính năng nhập ) thì xác thực cho chúng cũng sẽ bị vô hiệu hóa, hãy chú ý điều đó!

(Và nếu bạn đang sử dụng trên nút gửi giống như [disabled]="!form.valid"nó sẽ loại trừ trường của bạn khỏi xác thực)

nhập mô tả hình ảnh ở đây


1
Làm cách nào bạn có thể xác thực các trường bị vô hiệu hóa ban đầu nhưng được đặt động?
NeptuneOyster

5

Một cách tiếp cận tổng quát hơn sẽ là.

// Variable/Flag declare
public formDisabled = false;

// Form init
this.form = new FormGroup({
  name: new FormControl({value: '', disabled: this.formDisabled}, 
    Validators.required),
 });

// Enable/disable form control
public toggleFormState() {
    this.formDisabled = !this.formDisabled;
    const state = this.formDisabled ? 'disable' : 'enable';

    Object.keys(this.form.controls).forEach((controlName) => {
        this.form.controls[controlName][state](); // disables/enables each form control based on 'this.formDisabled'
    });
}

3

Nếu bạn muốn tắt first(kiểm soát biểu mẫu) thì bạn có thể sử dụng câu lệnh dưới đây.

this.form.first.disable();


3

Điều này đã làm việc cho tôi: this.form.get('first').disable({onlySelf: true});


3
this.form.enable()
this.form.disable()

Hoặc formcontrol 'đầu tiên'

this.form.get('first').enable()
this.form.get('first').disable()

Bạn có thể đặt tắt hoặc bật trên thiết lập ban đầu.

 first: new FormControl({disabled: true}, Validators.required)

2

nhập mô tả hình ảnh ở đây

lastName: new FormControl({value: '', disabled: true}, Validators.compose([Validators.required])),

1

Giải pháp tốt nhất là ở đây:

https://netbasal.com/disabling-form-controls-when-working-with-reactive-forms-in-angular-549dd7b42110

Phác thảo giải pháp (trong trường hợp liên kết bị hỏng):

(1) Tạo một chỉ thị

import { NgControl } from '@angular/forms';

@Directive({selector: '[disableControl]'})
export class DisableControlDirective {

  @Input() set disableControl( condition : boolean ) {
    const action = condition ? 'disable' : 'enable';
    this.ngControl.control[action]();
  }

  constructor( private ngControl : NgControl ) {}
}

(2) Sử dụng nó như vậy

<input [formControl]="formControl" [disableControl]="condition">

(3) Vì các đầu vào bị vô hiệu hóa không hiển thị trong form.value khi gửi, bạn có thể cần sử dụng những thứ sau để thay thế (nếu được yêu cầu):

onSubmit(form) {
  const formValue = form.getRawValue() // gets form.value including disabled controls
  console.log(formValue)
}

Tôi đã thử cách này. Tôi đang hiển thị hầu hết các FormControls của mình sau khi kéo dữ liệu API, vì vậy sau khi thiết lập / vá giá trị cho formControl bằng cách sử dụng, this.form.get('FIELD_NAME').patchValue(DYNAMIC_VALUE)tôi sẽ hiển thị formControl. khi nó được chuyển đến chỉ thị, nó hiển thị Không thể đọc thuộc tính 'vô hiệu hóa' của không xác định
ImFarhad

0

Tôi gặp sự cố tương tự nhưng việc gọi this.form.controls ['name']. Disable () không khắc phục được sự cố vì tôi đang tải lại chế độ xem của mình (sử dụng router.navigate ()).

Trong trường hợp của tôi, tôi phải đặt lại biểu mẫu của mình trước khi tải lại:

this.form = undefined; this.router.navigate ([đường dẫn]);



0

Bạn có thể khai báo một chức năng để bật / tắt tất cả điều khiển biểu mẫu:

  toggleDisableFormControl(value: Boolean, exclude = []) {
    const state = value ? 'disable' : 'enable';
    Object.keys(this.profileForm.controls).forEach((controlName) => {
      if (!exclude.includes(controlName))
        this.profileForm.controls[controlName][state]();
    });
  }

và sử dụng nó như thế này

this.toggleDisableFormControl(true, ['email']);
// disbale all field but email

-2

Để thực hiện một lĩnh vực vô hiệu hóakích hoạt tính năng của phản ứng dạng góc 2+

1. Để tắt

  • Thêm [attr.disabled] = "true" vào đầu vào.

<input class="form-control" name="Firstname" formControlName="firstname" [attr.disabled]="true">

Để kích hoạt

export class InformationSectionComponent {
formname = this.formbuilder.group({
firstname: ['']
});
}

Bật toàn bộ biểu mẫu

this.formname.enable();

Chỉ bật trường cụ thể

this.formname.controls.firstname.enable();

tương tự cho vô hiệu hóa, thay thế enable () bằng vô hiệu hóa ().

Điều này hoạt động tốt. Bình luận cho các truy vấn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.