Json 使用角度中的字符串路径提取嵌套对象特性

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' } ] 模板 &

是否有某种方法可以从控制器传递嵌套路径,然后在模板中使用? 我希望模板中的类型绑定传递change.Property.PropertyName路径中的内容

控制器

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>