How to return form values in Angular?

Viewed 85

i've built a simple page in angular which gets some data from a webservice, puts it into variables, and displays them in text boxes (and one check box) and now I need to pass the values of those controls into a function when I click a submit button. I have found a few examples on the web but most either don't work or are too complicated for my needs as a beginner.

I have added a form around my controls like this:

<form #policydetails="ngForm" (ngSubmit)="onClickSubmit(policydetails)">

</form>

And I have added ngModel to each of the input controls. In my ts file I have an interface:

interface policyDetails {
 surveyChecked: boolean;
  title: string;
  name: string;
  address1: string;
  address2: string;
  address3: string;
  address4: string;
  address5: string;
  postcode: string;
  telephone: string;
  telephone_work: string;
  telephone_mobile: string;
  email: string;
  policy_no: string;
}

And my onClickSubmit function looks like this:

onClickSubmit(policydetails: policyDetails) {
  alert(policydetails.title);
}

This seems like it should work, but when I serve the site I get this:

Compiled with problems:X

ERROR

src/app/app.component.html:4:59 - error TS2345: Argument of type 'NgForm' is not assignable to parameter of type 'policyDetails'.
  Type 'NgForm' is missing the following properties from type 'policyDetails': surveyChecked, title, address1, address2, and 9 more.

4   <form #policydetails="ngForm" (ngSubmit)="onClickSubmit(policydetails)">

Can anyone tell me what i'm doing wrong? Please try to keep your answer clear and simple as i'm very new to Angular. Thanks!

3 Answers

You can remove ="ngForm" as it is the wrong syntax. you can do #policydetails for policydetails to be your id. Try this

<form #policydetails (ngSubmit)="onClickSubmit()">

</form>

This will give you an empty form that submits to nothing, then you can use some angular FormControl, to keep track of your data. You can go to Angular form for the full documentation.

I have to say I'm a little disappointed at the response to this, given that it's such a basic task for an angular developer. In any case, I've managed to find a solution by myself. I made a small tweak to the form from:

<form #policydetails="ngForm" (ngSubmit)="onClickSubmit(policydetails)">

</form>

to:

<form #policydetails="ngForm" (ngSubmit)="onClickSubmit(policydetails.value)">

</form>

I also had to change the inputs from:

<input type="text" value="{{ title }} " name="title" ngModel>

to:

<input type="text" [(ngModel)]="title" name="title" />

Anyway, thanks Zepse Wolf and Eliseo for trying. Hopefully this might help others trying to get to grips with angular.

Some points to the response to the question (It's only as curiosity because really the best bet is use [(ngModel)], or Reactive Forms

Really you can use only ngModel in the way

  <input name="first" ngModel required>

(no need [(ngModel)]).

If you want to know if the input is touched or has errors you can use a template reference variable:

<input name="first" ngModel required #first="ngModel"> 
<span *ngIf="first.errors && first.touched">Required!!</span>

To give value you can use the own "ngForm" in the way, e.g.

  //get the ngForm
  @ViewChild('policydetails',{static:true}) ngForm:NgForm

  
  @ViewChild('policydetails') ngForm:NgForm

  ngOnInit()
  {
    //it's necesary enclosed in a setTimeout because 
    //Angular "create the ngForm" after paint it
    setTimeout(()=>{
      this.ngForm.setValue({first:'first',last:'last'})

    })
  }

see the stackblitz

But, really is good practice use [(ngModel)] in each input

<input type="text" [(ngModel)]="first" name="title" />

And, as the answer indicate, if we use [(ngModel)] never use value (or checked if is a checkbox). Simply give value to the variable

Related