How to make a formControl readonly

后端 未结 6 538
死守一世寂寞
死守一世寂寞 2020-12-15 03:24

How to make a formControl in angular readonly

I know i can do it in html like


         


        
相关标签:
6条回答
  • 2020-12-15 03:27

    For the reactive-forms, if you want to make the fields readonly, one way to do so would be to do with plain old javascript using:

    (document.getElementById('abc') as HTMLInputElement).setAttribute('readonly','true');
    

    In addition to this, you can convert the code to more typescript and angular way. Use @ViewChild to access the element and then set the readonly property to true:

    HTML

    <input [formControl]='data' id='abc' #element [readonly]="data.disabled"/>
    

    TS

    @ViewChild('element',{static:true, read: ElementRef}) element : ElementRef ;
    (this.element.nativeElement as HTMLInputElement).readOnly = true;
    

    However, you will need to check for the status of the formControl before modifying the readonly property.

    0 讨论(0)
  • 2020-12-15 03:35

    We can use any html attribute and bind it in angular using [].

    So,you can use attribute binding for the attribute readonly in that control

    e.g

    <input type="text" formControlName="xyz" [readonly]="anyBooleanPropertyFromComponent" />

    0 讨论(0)
  • 2020-12-15 03:43

    If you are using Reactive Forms you can assign it dynamically like in the example code below (email field)

        this.registerForm = this.formBuilder.group({
              first_name: ['', Validators.required],
              last_name: ['', Validators.required],
              email: new FormControl({value: null, disabled: true}, Validators.required),
              password: ['', Validators.compose([Validators.required, Validators.email])],
              confirm_password: ['', Validators.required],
        });
    

    If you want to get all the values including disabled controls you should use:

        this.registerForm.getRawValue();
    

    View method comment on source code

        /**
           * The aggregate value of the `FormGroup`, including any disabled controls.
           *
           * If you'd like to include all values regardless of disabled status, use this method.
           * Otherwise, the `value` property is the best way to get the value of the group.
           */
          getRawValue(): any;
    

    Enjoy coding!

    0 讨论(0)
  • 2020-12-15 03:45

    In my guess there is no use of READONLY in a Reactive Form (Angular 2+).

    In a normal HTML, CSS based project

    We use READONLY attribute to prevent user from type/select the form control but we get value from the input.

    We use DISABLED attribute to prevent user from type/select the form control and we dont get value from the input.

    In an Angular 2+ CLI based Projects

    We don't need READONLY attribute to prevent user from type/select. Because DISABLED attribute is enough to prevent user from type/select and also you can get value from the disabled input/select/checkbox/radio field.

    You can add disabled attribute to the field in model-driven way

    While creating FormGroup

    this.formGroupName = this.fb.group({
        xyz: [{ value: '', disabled: true }, Validators.required]
    });
    

    At Runtime

    this.formGroupName.get('xyz').disable({ onlySelf: true });
    

    Getting values from FormGroup (Edited)

    To get values from not disabled fields only

    this.formGroupName.value;
    

    To get values of all fields in the FormGroup

    this.formGroupName.getRawValue();
    

    So here you no need of READONLY attribute. Hope it helps.

    0 讨论(0)
  • 2020-12-15 03:48

    Programmatically enable / disable formcontrol

    disable() {
       this.formcontrol.disable()
    }
    
    enable() {
       this.formcontrol.enable()
    }
    

    Manually set formcontrol as disabled

    let formcontrol = new FormControl({ value: '', disabled: true })
    
    0 讨论(0)
  • 2020-12-15 03:50

    A simple solution is to set the formcontrol as not disabled:

    this._formBuilder.group({
                some: new FormControl(
                  {
                    value: parseInt(this.myobject.subObject.stringMember),
                    disabled: false
                  },
                  Validators.required
                ),
    

    and, at the same time, to set the <input> and/or <textarea> as readonly:

    • textarea:
      <label>
        <span class="label">SomeLabel</span>
        <textarea
          maxlength="500"
          formControlName="some"
          readonly>
        </textarea>
      </label>
    
    • input:
    <input type="text" formControlName="name" />
    

    this works with input and textarea at least.

    0 讨论(0)
提交回复
热议问题