两个不同 Angular 模型之间的映射

Posted

技术标签:

【中文标题】两个不同 Angular 模型之间的映射【英文标题】:Mapping between two different Angular models 【发布时间】:2021-05-23 00:44:48 【问题描述】:

我正在尝试将 Order.ts 映射到 OrderAction.ts,但收到错误无法准备好未定义的属性“0”。当我尝试将 Order 属性映射到 OrderAction 属性时出现此错误。

这里是 Order.ts:

export class Order 
    OrderId: number;
    FunctionStatusList?: OrderFunctionStatus[];


export class OrderFunctionStatus 
    FunctionTypeCode: number;
    AvailableActions: OrderAvailableAction[];


export class OrderAvailableAction 
    ActionLabel: string;
    ActionValue: string;
      

这是 OrderAction.ts:

export class OrderAction 
   FunctionTypeCode: number;
   SelectedAction: string;
   OrderList: AvailableAction[];


export class AvailableAction 
   OrderId: number;
   IsAvailableAction: boolean;
   AvailableActions?: OrderAvailableAction[];
 

这是我写的代码:

    orders: any[] = [];
    orderActionList: any[] = [];

    ngOnInit() 
        this.orders = this.orderService.getCheckedOrders();
        this.orders.forEach((order: Order, i) => 
            let orderAction: OrderAction = new OrderAction();
            orderAction.OrderList[i].OrderId = order.OrderId;
            orderAction.FunctionTypeCode = order.FunctionStatusList[i].FunctionTypeCode;
            orderAction.AvailableActions = order.FunctionStatusList[i].AvailableActions;
            orderAction.IsAvailableAction = order.FunctionStatusList[i].AvailableActions.length > 0 == true || false;
            this.orderActionList.push(orderAction);
        );
    

这是 Order.ts json 的示例:

    
        "OrderId": "1",
        "FunctionStatusList": [
            "FunctionTypeCode": "1",
            "AvailableActions": [
                "ActionLabel": "1",
                "ActionValue": "1"
            ]
        ]
     

这是 OrderAction.ts json 的示例:

    
    "FunctionTypeCode": "1",
    "SelectedAction: "1",
    "OrderList": [
       "OrderId": "1",
       "IsAvailableActionsLoaded": "1",
       "AvailableActions": [
          "ActionLabel": "1",
          "ActionValue": "1"
       ]
    ]
   

【问题讨论】:

【参考方案1】:

我不确定你到底在哪里得到错误,但我做了以下操作,它将Order 转换为OrderAction:https://plnkr.co/edit/VEHAdk3qPRIFkEAU?preview

代码的核心是这样的:

this.orders.forEach((order: Order, i) => 
    this.orderActions.push(
        FunctionTypeCode: order.FunctionStatusList[i].FunctionTypeCode,
        SelectedAction: null,
        OrderList: [
          
            OrderId: order.OrderId,
            IsAvailableActionsLoaded:
              order.FunctionStatusList[i].AvailableActions.length > 0,
            AvailableActions: order.FunctionStatusList[i].AvailableActions,
          ,
        ],
     );
);

我将 SelectedAction 保留为 null,因为不清楚如何设置此值。

【讨论】:

我认为我遇到的问题之一是 FunctionStatusList 是 OrderFunctionStatus[] 的数组,因此循环遍历列表订单不允许我循环遍历 FunctionStatusList。我们可以在一个房间里讨论这个问题,以便我可以向您展示我正在尝试的代码吗? 所以一个Order中可以有多个FunctionTypeCode,而OrderAction中只有一个。如果它们不同,哪一个会赢?至于 AvailableActions,您可以将它们收集在一个单独的数组中,并在检查完所有 FunctionStatusLists 后将其设置为 AvailableActions

以上是关于两个不同 Angular 模型之间的映射的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2 observable 没有“映射”到模型

属性映射工具——MapStruct

属性映射工具——MapStruct

如何在两个组件之间使用Angular7(角度材料)拖放

Angular 8在两个组件之间发送数据[重复]

在同一项目中的两个 Angular 应用程序之间导航