html - 将 String 附加到 ngModel 以获取表达式

标签 html angular typescript angular-ngmodel

我有一个业务对象 Car{id:2,name:ford,modelNo:123} 我还有一个 MetaData 类用于 CarMetaData{columnName:string,type:text,required :真 每个属性都有自己的 CarMetaData 对象 如何使用 CarMetaData 对象数组以这种方式在表单中显示 Car 数据

在template.html文件中

<form #carForm='ngForm'>
 <div class="form-group" *ngFor="let metaData of metadata" >
   <input [(ngModel)]="car[metaData.columnName]" name="metaData.columnName" 
    type="text">
 </div>
</form>

在组件文件中

car:Car;
metadata:CarMetaData[];

由于 car[meta.columnName] 中的 [] ,上述方法不起作用 ngModel 有没有一种方法可以在 *ngFor 或 [(ngModle)] 中计算出一个表达式来计算 columName

最佳答案

非常愚蠢的错误。请试试这个:

<div *ngFor="let meta of metaData;">
  <input [(ngModel)]="car[meta.columnName]" name="{{meta.columnName}}"  />
  {{meta.columnName}}
</div>


旧答案:

但首先 - 您的循环(meta in metaData)是错误的,因为您循环的是数组,而不是对象。所以你最好做 let meta of metaData, let i = index

有趣的部分是 ngModel 如何设置 ngFor 中的输入值。如果您尝试这样做:

<div *ngFor="let meta of metaData; let i = index">
  <input [(ngModel)]="car[meta.columnName]" name="meta.columnName"  />
  {{meta.columnName}}
</div>

您会看到所有输入的输入值都相同(它是从第一次 ngFor 迭代中选取的,并重复到所有输入)。但是,{{meta.columnName}} 打印出正确的值。所以存在一些范围界定问题。其他奇怪的事情 - 它肯定与 ngForm 和输入的 name 属性有关。如果您将其移出表格 - 一切都会按预期发生。如果你:

<div *ngFor="let meta of metaData; let i = index">
  <input [(ngModel)]="car[meta.columnName]" name="{{metaData[i].columnName}}"  />
  {{meta.columnName}}
</div>

在表单内部 - 同样,一切正常。所以这可能是您的解决方法。

这是一个DEMO .希望有人能进一步解释。

关于html - 将 String 附加到 ngModel 以获取表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49473626/

相关文章:

javascript - 尝试使用nodejsexpress打开网页时出错

javascript - 显示在 Angular 2 中找不到任何记录

javascript - 为什么我的 TypeScript 伪字典似乎只存储关键字符串?

html - 使网格项跨越到隐式网格中的最后一行/列

javascript - 如何确定用户是否使用 jQuery 滚动到 HTML 容器的末尾?

angular - 如何使用 Angular 库中文件的相对路径?

javascript - 在 ReactJS 中渲染数组的内容

javascript - 如何将base64 url​​设置为图像src

html - 具有固定列和流动列的 CSS 布局

angular - 单页应用页面刷新