将 String 附加到 ngModel 以获取表达式
append String to ngModel to get an expression
我有一个业务对象 Car{id:2,name:ford,modelNo:123}
我还有一个元数据 class 用于 CarMetaData{columnName:string,type:text,required:true}
每个属性都有自己的 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[];
由于[] in car[meta.columnName] in the
ngModel 有没有一种方法可以在 *ngFor 或 [(ngModle)] 中计算表达式来计算 columName
我建议将两个对象放在 wrapper-object 中。例如
export class CarWrapper {
constructor(
car: Car,
carMetaData: CarMetaData
) {}
}
然后在这个包装器中构建一个连接两个对象的方法
private carWrapper: Array<CarWrapper> = [];
private fillCarWrapper(): void {
// your code here
}
在你的模板中你的行为是这样的
<form #carForm='ngForm'>
<div class="form-group" *ngFor="let wrapper of carWrapper">
<input [(ngModel)]="wrapper.car" name="wrapper.carMetaData.columName" type="text">
</div>
</form>
非常愚蠢的错误。请试试这个:
<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。希望有人能进一步解释。
我有一个业务对象 Car{id:2,name:ford,modelNo:123}
我还有一个元数据 class 用于 CarMetaData{columnName:string,type:text,required:true}
每个属性都有自己的 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[];
由于[] in car[meta.columnName] in the ngModel 有没有一种方法可以在 *ngFor 或 [(ngModle)] 中计算表达式来计算 columName
我建议将两个对象放在 wrapper-object 中。例如
export class CarWrapper {
constructor(
car: Car,
carMetaData: CarMetaData
) {}
}
然后在这个包装器中构建一个连接两个对象的方法
private carWrapper: Array<CarWrapper> = [];
private fillCarWrapper(): void {
// your code here
}
在你的模板中你的行为是这样的
<form #carForm='ngForm'>
<div class="form-group" *ngFor="let wrapper of carWrapper">
<input [(ngModel)]="wrapper.car" name="wrapper.carMetaData.columName" type="text">
</div>
</form>
非常愚蠢的错误。请试试这个:
<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。希望有人能进一步解释。