Search code examples
angularformsangular-formsangular7

Loop a array of string to a text box and post from a submit form with the changes angular 7


Hi am sure this is asked before but am not able to find an answer here. i have an array of string which is loop and rendered as text box inside a form while submitting the form all the value with new changed value should submit to onSubmit()

 <form name="form" (ngSubmit)="f.form.valid && onSubmit()" #f="ngForm" novalidate>

  <input type="text" class="form-control" name="caption" [(ngModel)]="blockdummyJson.Properties.Caption" #Caption="ngModel"
    [ngClass]="{ 'is-invalid': f.submitted && Caption.invalid }" required />
  <div *ngIf="f.submitted && Caption.invalid" class="invalid-feedback">
    <div *ngIf="Caption.errors.required">radio button caption is required</div>
  </div>
  <input type="button" value="addOption" (click)="addOptionToRadioOption()" />

  <div *ngFor="let option of blockdummyJson.Properties.Options; let i = index">
    <input type="text" class="form-control" [(ngModel)]="blockdummyJson.Properties.Options[i]" />
  </div>
  <div class="form-group">
    <button class="btn btn-primary">Add</button>
  </div>

</form>

in side component

radioOption:any=[];
  data: any;
  blockdummyJson: any;
  blockName: string = 'OptionBuildingBlock';
  activityInfo: any;

  constructor(private messageservice: MessageService,
    private httpservice: ConfigService,
    private communicationservice: CommunicationService, ) { 

    var self = this;
    this.activityInfo = this.data;

    this.httpservice.getConfig(ConfigValue.apiURI + 'BuildingBlocks/' + this.blockName).subscribe(
      data => {
        self.blockdummyJson = data;
      },
      err => { },
      () => console.log('getting BuildingBlocks config completed')
    )

  }
    addOptionToRadioOption()
      {
        this.blockdummyJson.Properties.Options.push("sample Value");
      }

      onSubmit() {
        debugger;
      }

the data coming from server Options include array

Options=['test','test1',test2'];

thanks in advance.


Solution

  • You are already having two way data-binding, on every user input it will get updated to the DOM. Instead of depending ngForm, you are use modelObj.

    export class AppComponent  {
      name = 'Angular';
    
      blockdummyJson = {
        Properties: {
          Options :['test','test1','test2'],
          Caption: ''
        }
      };
    
      addOptionToRadioOption()
          {
            this.blockdummyJson.Properties.Options.push(this.blockdummyJson.Properties.Caption);
          }
    
      onSubmit(formObj){
        console.log(this.blockdummyJson);
      }
    

    Template:

    <form name="form" (ngSubmit)="f.valid && onSubmit(f)" #f="ngForm" novalidate>
    
      <input type="text" class="form-control" name="caption" [(ngModel)]="blockdummyJson.Properties.Caption" #Caption="ngModel"
        [ngClass]="{ 'is-invalid': f.submitted && Caption.invalid }" required />
      <div *ngIf="f.submitted && Caption.invalid" class="invalid-feedback">
        <div *ngIf="Caption.errors.required">radio button caption is required</div>
      </div>
      <input type="button" value="addOption" (click)="addOptionToRadioOption()" />
    
      <div *ngFor="let option of blockdummyJson.Properties.Options; let i = index">
        <input type="text" name="options-{{i}}" class="form-control" [(ngModel)]="blockdummyJson.Properties.Options[i]" />
      </div>
      <div class="form-group">
        <button class="btn btn-primary">Add</button>
      </div>
    
    </form>
    

    StackBlitz: https://stackblitz.com/edit/angular-vsxwuy