ngFor中的Angular2 ngModel

Meh*_*oha 11 data-binding angular2-ngmodel angular

我试图从我的输入绑定一个字符串数组,所以在html文件中我写了这个:

<div *ngFor="let word of words; let in=index" class="col-sm-3">
      <div class="form-group">
        <input type="text" [(ngModel)]="words[in]"  class="form-control" [attr.placeholder]="items[in]" required>
      </div>
  </div>
Run Code Online (Sandbox Code Playgroud)

但是这没有按预期工作,因为当我记录单词变量时,它显示在我的Component类中初始化的空数组.另外,我应该记录来自另一个组件的变量应该是我的问题的问题.我有两个组成部分:

  • 包含查询组件数组的表单组件.
  • 具有单词字符串数组的查询子组件.

因此,单词变量被声明到查询组件中,但我通过表单组件记录此变量,如下所示:

console.log(JSON.stringify(this.queries));
Run Code Online (Sandbox Code Playgroud)

虽然查询是表单组件中的Query数组:

queries:Query[] = [];
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

Gün*_*uer 20

问题在于使用原始值数组(words)ngFor.

您可以将单词更改为对象数组

words = [{value: 'word1'}, {value: 'word2'}, {value: 'word3'}];
Run Code Online (Sandbox Code Playgroud)

并使用它

  <div *ngFor="let word of words; let in=index" class="col-sm-3">
      <div class="form-group">
        <input type="text" [(ngModel)]="words[in].value"  class="form-control" [attr.placeholder]="items[in]" required>
      </div>
  </div>
Run Code Online (Sandbox Code Playgroud)

这也可能是可以解决的,trackBy但我不确定.

  • @acdcjunior如果你在你的plunker中写,在前两个输入字段中,它们在每次按键后松散焦点,而在较低输入中你可以正常写入.使用原始值,每次更改后都会重新创建行,因为每次值更改时都会替换数组值,并且输入会失去焦点,因为它会被删除而另一个会被添加.虽然在较低的输入中只有值发生变化,但`*ngFor`不必重新创建行. (2认同)

Mat*_*vić 15

每个输入标记都必须定义一个唯一的"名称"属性,如下所述:

ngFor中的Angular2 ngModel(数据不绑定输入)

这是更正后的代码:

<div *ngFor="let word of words; let in=index" class="col-sm-3">
  <div class="form-group">
    <input type="text" [(ngModel)]="words[in]" name="word{{in}}" class="form-control" [attr.placeholder]="items[in]" required>
  </div>
Run Code Online (Sandbox Code Playgroud)