1

我有一个 Angular 7 应用程序,我希望在其中有一长串 HTML 输入组件,每个组件共享相似的样式,但双向绑定到 Typescript 文件中单个对象的不同字段。我认为这应该可以通过配置数组来实现ngFor,类似于:

app.component.html:

<div *ngFor="let inputConfig of inputConfigs;">
    <input name="{{inputConfig.id}}" type="number" placeholder="{{inputConfig.description}}"
        [(ngModel)]="inputConfig.bindingField">
</div>

app.component.ts:

export class AppComponent {

  public objectToBind = {prop1: 5, prop2: 10, prop3: 30};
  public inputConfigs = [
      { id: "prop1", description: "Property 1", bindingField: this.objectToBind.prop1},
      { id: "prop2", description: "Property 2", bindingField: this.objectToBind.prop2},
      { id: "prop3", description: "Property 3", bindingField: this.objectToBind.prop3}
      // additional fields to follow
  ];
}

这个问题似乎是 Typescript(或者更确切地说,JS)bindingField: this.objectToBind.prop1在启动 inputConfigs 时按值复制。结果是输入组件实际上并没有绑定到objectToBind.prop1,而是绑定到它的文字副本,没有任何引用。

有没有办法解决这个问题,我想用ngModela绑定到不同的属性ngFor?还是我别无选择,只能放弃ngFor并在模板中静态编写所有内容?任何帮助将不胜感激!

顺便说一句,有一些答案指向在ngModel表达式中使用索引,例如添加let index = index;ngFor使用[(ngModel)]="inputConfigs[index].bindingField"。但这似乎没有帮助。

4

2 回答 2

1

只要inputConfigs有对象,您就可以这样做

  public inputConfigs = [
      { id: "prop1", description: "Property 1", value: 5},
      { id: "prop2", description: "Property 2", value: 10},
      { id: "prop3", description: "Property 3", value: 20}
      // additional fields to follow
  ];

模板

<div *ngFor="let inputConfig of inputConfigs;">
    <input name="{{inputConfig.id}}" type="number"[(ngModel)]="inputConfig.value">
</div>

并且值将绑定到inputConfig.value每个对象

于 2018-12-18T08:49:59.330 回答
1

它是必然的inputConfig.bindingField,不是objectToBind.prop1的。

您需要绑定objectToBind[inputConfig.id]到 ngModel。

app.component.html:

<div *ngFor="let inputConfig of inputConfigs;">
    <input name="{{inputConfig.id}}" type="number" placeholder="{{inputConfig.description}}"
        [(ngModel)]="objectToBind[inputConfig.id]">
</div>
于 2018-12-18T08:23:04.370 回答