首页 > 解决方案 > 无法以角度 6 将具有反应形式的表单数据发送到 api 端点

问题描述

我正在学习Angular 6并在Django.

我必须将JSON格式的表单数据发送到服务器。

这就是我在组件中所做的。

我的.component.ts

import { Component, OnInit } from '@angular/core';
import {FormBuilder, FormControl, FormGroup, Validators} from '@angular/forms';
import {AmountGivenService} from '../amount-given.service';
import {ActivatedRoute} from '@angular/router';

@Component({
  selector: 'app-amount-given-add',
  templateUrl: './amount-given-add.component.html',
  styleUrls: ['./amount-given-add.component.css']
})
export class AmountGivenAddComponent implements OnInit {

  addMoneyForm: FormGroup;
  submitted = false;
  contact_id: string;

  constructor(
    private formBuilder: FormBuilder,
    private amountGivenService: AmountGivenService,
    private route: ActivatedRoute
  ) { }

  ngOnInit(): void {

    this.route.params.subscribe(
      param => {
        this.contact_id = param['contact_id'];
      }
    );

    console.log(this.contact_id);

    this.addMoneyForm = this.formBuilder.group({
      amount: new FormControl('', [
        Validators.required
      ]),
      duration: new FormControl()
    });
  }

  get f() {
    return this.addMoneyForm.controls;
  }

  onSubmit() {
    this.submitted = true;

    // stop here if form is invalid
    if (this.addMoneyForm.invalid) {
      console.log('invalid');
      return;
    }

    console.log(this.addMoneyForm.getRawValue());

    let data = this.addMoneyForm.value;
    data = JSON.parse(data);

    // append contact_id
    data.contact_id = this.contact_id;
    data = JSON.stringify(data);

    this.amountGivenService.add(data).subscribe(res => {
      console.log('req completed', res);
    });
  }

}

在发送请求之前,我需要附加contact_id.

但是在提交表单时,页面会以 GET 方法提交的表单刷新。

从上面的组件文件中删除此代码元素正在查找并且请求正在发送到服务器。

data = JSON.parse(data);

// append contact_id
data.contact_id = this.contact_id;
data = JSON.stringify(data);

如何将值附加到组件中的表单数据?

编辑 2:my.component.html

<form [formGroup]="addMoneyForm" (submit)="onSubmit()" id="form-add-money" #formDir="ngForm">

    <label for="input-amount">Amount</label>
    <input formControlName="amount"
           id="input-amount"
           class="form-control"
           placeholder="Amount">
    <div *ngIf="submitted && f['amount'].invalid" class="text-danger">
        <div *ngIf="f['amount'].errors.required">Amount is required</div>
        </div>
    </div>

    <label for="input-duration">Duration (in days)</label>
    <input formControlName="duration" type="number" id="input-duration" class="form-control" placeholder="Duration (in days)">

</form>

<button class="btn btn-success" type="submit" form="form-add-money" [disabled]="!formDir.valid">
    <i class="fa fa-save">Save</i>
</button>

标签: angularangular6angular-forms

解决方案


let data = this.addMoneyForm.value;
data = JSON.parse(data);

// append contact_id
data.contact_id = this.contact_id;
data = JSON.stringify(data);

this.amountGivenService.add(data).subscribe(res => {
  console.log('req completed', res);
});

这没有什么意义:

  • 表单的值不是 JSON 字符串。它是一个对象。解析对象没有意义
  • your amountGivenService should not (and does not, apparently) take a JSON string as argument. It should (and does, apparently) take a typed object.

All you should have is

const data = this.addMoneyForm.value;
data.contact_id = this.contact_id;

this.amountGivenService.add(data).subscribe(res => {
  console.log('req completed', res);
});

Also, in your template, the submit button is outside of the form. It must be inside.


推荐阅读