【问题标题】:Dynamic values get reset when adding new Input field inside Form | Angular 4在表单中添加新的输入字段时,动态值会被重置 |角 4
【发布时间】:2018-03-27 10:15:58
【问题描述】:

我有一个带有电话字段的表单,当您单击“添加”按钮时,将出现一个新字段。发生的情况是,当我单击“添加”时,在先前字段中键入的值会被重置。我设法通过删除“表单”标签使其工作,但我的项目中需要这个表单。如何使用“表单”使其工作?

HTML

<form>
   <div *ngFor="let phonecount of phonecount; let i = index" class="form-group">
<label>Optional Phone </label>
<input type="text" class="form-control" [(ngModel)]="user.extraphones[i]" name="phone2">
 </div>
<input (click)="onSubmito()" type="submit" value="Add" class="btn btn-primary">
</form>

TS

user = {
          name:'',
          phone:'',
          extraphones:[]
      };
  namee='';
   phonecount:string[]=[''];
onSubmito(){
  this.phonecount.push(this.namee);
}

朋克:https://plnkr.co/edit/i85x1m?p=preview

【问题讨论】:

  • phonecountuser.extraphones 没有任何关系。这是您问题的根源。

标签: javascript forms angular typescript


【解决方案1】:

确保您绑定到正确的东西。同样,请确保在使用单击“添加”时更新正确的集合。

在更好地了解您的问题后,我找到了this SO answerthis GitHub issue

能够解决您的问题...请注意以下事项:

  • 模板中的trackBy:trackById 和打字稿代码中的trackById 函数。
  • &lt;input&gt; 字段上的 name 属性。

//our root app component
import {Component, NgModule, VERSION} from '@angular/core'
import {FormsModule} from '@angular/forms'
import {BrowserModule} from '@angular/platform-browser'

export class Info {
  id: number;
  description: string;
}

    @Component({
      selector: 'my-app',
      template: `
      <form>
       <div *ngFor="let ph of user.extraphones; let i = index; trackBy:trackByIndex" class="form-group">
        <label>Optional Phone</label>
        <input type="text" class="form-control"
          [(ngModel)]="user.extraphones[i]" name="item-{{i}}">
      </div>
      <input (click)="onSubmito()" type="submit" value="Add" class="btn btn-primary">
    </form>

      {{ user.extraphones | json }}
      `,
    })
    export class App {
      user = {
              id:'',
              _id:String,
              name:'',
              phone:'',
              extraphones:['123', '345', '678'],
              rank:''
          };

      namee='';

      onSubmito(){
        this.user.extraphones.push(this.namee);
      }

      trackByIndex(index: number, value: number) {
        return index;
      }
      }
    }

@NgModule({
  imports: [ BrowserModule, FormsModule ],
  declarations: [ App ],
  bootstrap: [ App ]
})
export class AppModule {}

【讨论】:

  • 我会试试这个。但是,将输入 ngmodel 更改为 'phone' 不会使其插入到 phone 属性而不是 extraphones 中吗?
  • @Gustavo 我已经修改了模板和 TS 代码,以便您更容易理解发生了什么。我也强烈建议您使用更好的名称。
  • 此表单上发送的数组值与预期不符。它正在获取“namee”属性值并添加到除第一个之外的所有数组值(我通过 REST API 发送这个)。我将 TS 上的 namee 值更改为 = 'somedata' 以更好地解释。以下是我发送 3 个具有不同值的字段时发生的情况:extraphones:(3) ["", "somedata", "somedata"]
  • @Gustavo 现在我看到害羞了。出于多种原因,将电话存储为字符串数组是一个可怕的想法。其中之一是 Angular 将无法检测到更改(因为字符串是原始类型),除非我们特别指示它。注意input 标签上的name 属性;和trackById 函数。阅读它们以更好地了解正在发生的事情。
  • 希望我这次回答了你的问题 :)
猜你喜欢
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 2020-10-29
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 2018-09-17
  • 1970-01-01
相关资源
最近更新 更多