Json 使用角度中的字符串路径提取嵌套对象特性
是否有某种方法可以从控制器传递嵌套路径,然后在模板中使用? 我希望模板中的类型绑定传递change.Property.PropertyName路径中的内容 控制器Json 使用角度中的字符串路径提取嵌套对象特性,json,angular,angular-template,Json,Angular,Angular Template,是否有某种方法可以从控制器传递嵌套路径,然后在模板中使用? 我希望模板中的类型绑定传递change.Property.PropertyName路径中的内容 控制器 private _columns = [ { field: 'Name', title: 'Type', displayType: 'Property.PropertyName' }, { field: 'ChangeDate', title: 'Date', displayType: 'Date' } ] 模板 &
private _columns = [
{ field: 'Name', title: 'Type', displayType: 'Property.PropertyName' },
{ field: 'ChangeDate', title: 'Date', displayType: 'Date' }
]
模板
<tr *ngFor="let change in changes">
<td *ngFor="let col of _columns">
<z-grid-cell-display [type]="change[col.displayType]" [field]="change" [context]="change[col.field]"></z-grid-cell-display>
</td>
</tr>
您可以使用如下递归函数:
@Component({...})
export class Foo {
transform(value: any, name: string): any {
if (Array.isArray(value) || !(value instanceof Object) || !name) {
return value;
} else if (name.indexOf('.') > -1) {
const splitName: string[] = name.split(/\.(.+)/, 2);
return this.transform(value[splitName[0]], splitName[1]);
} else {
return value[name];
}
}
}
并在模板中使用它,如下所示:
<td *ngFor="let col of _columns">
<z-grid-cell-display [type]="transform(change, col.displayTipe)" [field]="change" [context]="change[col.field]"></z-grid-cell-display>
</td>
然后
<td *ngFor="let col of _columns">
<z-grid-cell-display
[type]="change | propertyValue: col.displayTipe"
[field]="change"
[context]="change | propertyValue: col.field">
</z-grid-cell-display>
</td>
您可以为此编写一个简单的方法
resolve(stringPath,baseObject):任意{
返回stringPath.split('.').reduce((p,q)=>{
返回p?p[q]:空;
},baseObject | self);
}
你能解释清楚吗?我不完全明白你需要什么我正在建一张表。每一行都是包含对象的数组的NgFor。对于每个单元格,我希望访问更改对象的属性的displayType。有些是嵌套的,有些是not@BrianMcCall您是否尝试过{{eval('change.+col.displayType)}
?当然,只有在您完全控制更改
和\u列
数据的情况下,否则评估
将被禁止。但这应该行得通。谢谢你的回答,我更喜欢管道方法,我自己也想过这样做,但我真的希望有一个更简单的答案:-(类似于更改[{{col.displayType}]。再次感谢Innope,如果不做类似于更改[property][propertyname]的事情,这是不可能的是的,但我的这个帐户没有足够的代表性来标记答案为已解决。:-(@BrianMcCall哦,太遗憾了。Welp,一定要在某个时候回来,否则这个问题/答案将被垃圾收集器删除。@Jota.Toledo-我将不得不使用这个帐户;-)
@Pipe({
name: 'propertyValue'
})
export class PropertyValuePipe implements PipeTransform {
transform(value: any, name: string): any {
if (Array.isArray(value) || !(value instanceof Object) || !name) {
return value;
} else if (name.indexOf('.') > -1) {
const splitName: string[] = name.split(/\.(.+)/, 2);
return this.transform(value[splitName[0]], splitName[1]);
} else {
return value[name];
}
}
}
<td *ngFor="let col of _columns">
<z-grid-cell-display
[type]="change | propertyValue: col.displayTipe"
[field]="change"
[context]="change | propertyValue: col.field">
</z-grid-cell-display>
</td>