4

我在 Angular 2 中创建表单时遇到问题。我需要提交一些由服务动态生成的值。使用 Angular 的 http 模块,我得到一个价格,然后用户现在可以确切地知道多少比特币是 X 数量的智利比索。我要做的是提交所有这些数据。我不能这样做,因为角度表单没有提交禁用/只读输入。这些输入是汇率和目标金额(相当于比特币)。

我尝试了模板驱动方法和数据驱动方法,但没有成功。我什至无法在控制台中记录值。如果我从输入中删除 disabled 或 readonly 属性,则值将记录在控制台中并提交到我的数据库。

感谢您花时间帮助我。这是我的代码:

组件.ts

import { Component, OnInit } from '@angular/core';
import { SurbtcService } from '../services/exchange/surbtc.service';
import { FormBuilder, FormGroup, Validators, FormControl, NgForm } from "@angular/forms";
import { FiredbService } from '../services/firedb.service';
import * as firebase from 'firebase/app';

@Component({
  selector: 'my-dashboard',
  templateUrl: './dashboard.component.html'
})
export class DashboardComponent {

  //myForm2: FormGroup;
  //error = false;
  //errorMessage = '';

  constructor(private surbtcService: SurbtcService, private fb: FormBuilder, private dbfr: FiredbService) {
/*
          this.myForm2 = this.fb.group({
            email: ['', Validators.email],
      clpmount: ['', Validators.required],
      btcmount: [''],
      rate: [''],
      descripcion: ['']

        });
 */  }
//Form

info = {
  rate: '',
  btcmount: ''
};


onSub() {
 console.log(this.info);
  }



  //surbtcservice

  prices: any;
  baseAmount: 1;

  get exchangeRate() {
   return this.prices * 0.989
    }

  get targetAmount() {
   return this.baseAmount / this.exchangeRate;
    }

  ngOnInit() {
     this.surbtcService.getPrices()
      .subscribe(prices => {
       this.prices = prices.ticker.min_ask[0];
       console.log(prices.ticker.min_ask[0]);
        });
    } }

正如您在我的代码中看到的那样,除了用于提交表单的函数外,对数据驱动的方法进行了注释。

html:

<form (ngSubmit)="onSub(f)" #f="ngForm">
          <div class="form-group">
            <md-input-container class="full-width">
              <input mdInput type="number" id="montoclp" name="clpmount" placeholder="Ingrese el monto en CLP" [(ngModel)]="baseAmount" name="clp">
            </md-input-container>
            <md-input-container class="full-width">
              <input mdInput class="form-control" name="btcmount" [ngModel]="info.btcmount" placeholder="Monto en BTC" id="vat" [value]="targetAmount | number:'1.8-8'" readonly>
            </md-input-container>
            <md-input-container class="full-width">
              <input mdInput class="form-control" name="rate" [ngModel]="info.rate" placeholder="Tasa de cambio" id="street" [value]="exchangeRate | number:'1.0-0'" readonly>
            </md-input-container>
            <md-input-container class="full-width">
              <input mdInput type="mail" class="form-control" ngModel name="email" placeholder="E-mail cliente (Opcional)">
            </md-input-container>
            <md-input-container class="full-width">
              <input mdInput type="text" class="form-control" ngModel name="descripcion" placeholder="Descripción pago (Opciona)">
            </md-input-container>
          </div>
          <button md-raised-button type="submit" color="primary" class="btn-w-md">Confirmar</button><div class="divider divider-sm"></div>
        </form>

再次感谢!

编辑!!!:

数据驱动的html:

            <form [formGroup]="myForm2" (ngSubmit)="onSub()">
              <div class="form-group">
                <md-input-container class="full-width">
                  <input mdInput type="number" id="montoclp" name="clpmount" placeholder="Ingrese el monto en CLP" formControlName="clpmount" [(ngModel)]="baseAmount">
                </md-input-container>
                <md-input-container class="full-width">
                  <input mdInput class="form-control" name="btcmount" placeholder="Monto en BTC" formControlName="btcmount" [value]="targetAmount | number:'1.8-8'">
                </md-input-container>
                <md-input-container class="full-width">
                  <input mdInput class="form-control" name="rate" formControlName="rate" placeholder="Tasa de cambio" [value]="exchangeRate | number:'1.0-0'">
                </md-input-container>
                <md-input-container class="full-width">
                  <input mdInput type="mail" class="form-control" formControlName="email" name="email" placeholder="E-mail cliente (Opcional)">
                </md-input-container>
                <md-input-container class="full-width">
                  <input mdInput type="text" class="form-control" formControlName="descripcion" name="descripcion" placeholder="Descripción pago (Opciona)">
                </md-input-container>
              </div>
              <button md-raised-button type="submit" color="primary" class="btn-w-md">Confirmar</button><div class="divider divider-sm"></div>
            </form>
4

3 回答 3

18

您可以使用getRawValue(),它为您提供所有表单值,甚至是禁用的值。

因此,当您的表单看起来像这样时:

this.myForm2 = this.fb.group({
  email: ['', Validators.email],
  clpmount: ['', Validators.required],
  btcmount: [{value: '', disabled: true}],
  ....
});

使用

this.myForm2.getRawValue()

将包括在上面的示例btcmount值中。

编辑:

看到模板......在反应形式中,Angular 忽略value[value]. 我们可以克服这一点并使用单向绑定,我也建议您使用您的字段clpAmount和 set进行绑定[ngModel]="baseAmount"。为什么?好吧,首先,该ngModel指令甚至不包含在 中ReactiveFormsModule,因此,即使在文档中没有明确提及,我们也可以假设它们不应该一起使用。我们也可以理解,如果[(ngModel)]一起使用,我们会有两个双向绑定,这有时会导致问题。

[ngModel]更好,因为 Angular 只是将值从 TS 绑定到模板,并不真正关心接下来会发生什么。在某些情况下,[ngModel]可以在反应形式中使用,这是其中一种情况。即使反应形式 ignore value,它也不会 ignore ngModel,所以我们可以在这里很好地使用它!所以交换[value][ngModel]

<input mdInput  formControlName="btcmount" [ngModel]="targetAmount | number:'1.8-8'">

<input mdInput formControlName="rate" placeholder="Tasa de cambio" [ngModel]="exchangeRate | number:'1.0-0'">

现在您在使用时拥有所有值getRawValue():)

于 2017-08-01T11:19:02.240 回答
1

如果您想要所有表单值,那么

更改此功能

onSub() {
 console.log(this.info);
}

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

onSub(formData : NgForm) {
 console.log(formData.value);
}

只读/禁用输入未在 Angular 中提交

Disabled将永远不会以任何形式提交但Readonly,您将始终以提交的形式获得它,

问题在于您的代码而不是角度

于 2017-08-01T04:59:38.623 回答
1

要使用反应形式扩展 Vivek 的答案,您可以这样做:

this.myForm2 = this.fb.group({
      email: ['', Validators.email],
      clpmount: ['', Validators.required],
      btcmount: [''],
      rate: [''],
      descripcion: ['']

});

public onSub() {
  console.log(this.myForm2.value);
}

或(关于更改):

ngOnInit() {
  ...
  this.form.valueChanges.subscribe(value => console.log(value));
}

基本上,您想从实际表单中获取数据,而不是从您的模型中获取数据。正如 Vivek 概述的那样,模型驱动也是如此(传递表单而不是使用模型)

于 2017-08-01T05:04:18.693 回答