该服务如何检索 JSON 对象数组?为什么不映射到 moel 对象上?
How exactly works this service retrieving a JSON objects array? Why is not mapping on moel objects?
我是 Angular 的新手,我很怀疑这种情况的具体情况:
在我的组件代码中我有这样的东西:
orders: Order[];
ngOnInit() {
this.ordersService.getAllOrders().then(orders => {
this.orders = orders;
console.log("RETRIEVED ORDERS: ", orders);
this.loading = false;
});
正如你首先看到的,我正在定义一个 Order 模型对象数组。
然后进入 ngOnInit() 方法我正在使用此 getAllOrders() 服务方法检索此数组:
getAllOrders() {
return this.http.get<any>('assets/json_mock/ordini.json')
.toPromise()
.then(res => <Order[]>res.data)
.then(data => { return data; });
}
这基本上是从 JSON 文件中检索值。
现在...来自 Java 我对它在 Angular\TypeScript 中是否有效有些怀疑。我的想法是我的 ordini.json 文件中定义的对象必须映射到 Order 模型对象上。
所以这是我的订单模型界面:
export interface Referent {
name?: string;
surname?: string;
role?: string;
}
export interface Company {
name?: string;
vat?: string;
bu?: BU;
}
export interface BU {
name?: string;
code?: string;
}
export interface OrderDetails {
dataInserimento?: Date;
commesse?: Array<string>;
identificativoContrattoHyperlink?: string;
tipologiaContratto?: string;
presenzaAQ?: string;
identificativoAQHyperlink?: string;
accordoQuadro?: string;
importoContratto?: number;
residuoAQ?: number;
compagineDiAQ?: number;
quotaPercentualeDiRTI?: number;
tipologiaDiPartecipazione?: string;
cig?: string;
cliente?: string;
vatCliente?: string
clienteFinale?: string;
vatClienteFinale?: string;
dataSottoscrizioneContratto?: string;
dataInizioAttivita?: Date;
dataFineAttivita?: Date;
statoOrdine?: string;
}
export interface Order {
id?: number;
name?: string;
company?: Company;
dettaglioOrdine?: OrderDetails;
}
正如您所见,我有一个 Order 接口,其中包含一些字段(有时定义为其他接口)。
这是我的JSON文件内容:
{
"data": [
{
"id": 1,
"referente": {
"name": "Mario",
"surname": "Rossi",
"complete_name": "Mario Rossi",
"role": "Operation Manager"
},
"company": {
"name": "TEST S.p.A.",
"VAT": "IT 03318271214",
"BU": {
"name": "Digital Solution",
"code": "DS"
}
},
"dettaglio_ordine": {
"data_inserimento": "2020-08-08",
"commessa": {
"code": "AAA0001"
},
"identificativo_contratto_hyperlink": "LINK-ID-CONTRATTO-TEST",
"tipologia_contratto": "ORDINE",
"presenza_AQ": true,
"identificativo_AQ_hyperlink": "LINK-AQ-TEST",
"accordo_quadro": 12,
"importo_contratto": 122000,
"residuo_AQ": 20000,
"compagine_di_AQ": "COMPAGINE-DI-AQ-TEST",
"quota_percentuale_di_RTI": 20,
"tipologia_di_partecipazione": "GARA PUBBLICA",
"cig": "CIG-TEST-1",
"cliente": "CLIENTE-TEST-1",
"vat_cliente": "VAT-CLIENTE",
"cliente_finale": "CLIENTE-FINALE-TEST-1",
"vat_cliente_finale": "VAT-CLIENTE-FINALE",
"data_sottoscrizione_contratto": "8/12/2020",
"data_inizio_attivita": "2020-08-28",
"data_fine_attivita": "2020-08-30",
"stato_ordine": "CHIUSO"
}
},
{
"id": 2,
"referente": {
"name": "Mario",
"surname": "Rossi",
"complete_name": "Mario Rossi",
"role": "Operation Manager"
},
"company": {
"name": "DGS S.p.A.",
"VAT": "IT 03318271214",
"BU": {
"name": "Cyber Security",
"code": "CS"
}
},
"dettaglio_ordine": {
"data_inserimento": "2020-08-09",
"commessa": {
"code": "AAA0002"
},
"identificativo_contratto_hyperlink": "LINK-ID-CONTRATTO-TEST",
"tipologia_contratto": "ORDINE",
"presenza_AQ": false,
"identificativo_AQ_hyperlink": "LINK-AQ-TEST",
"accordo_quadro": 12,
"importo_contratto": 122000,
"residuo_AQ": 20000,
"compagine_di_AQ": "COMPAGINE-DI-AQ-TEST",
"quota_percentuale_di_RTI": 20,
"tipologia_di_partecipazione": "GARA PUBBLICA",
"cig": "CIG-TEST-2",
"cliente": "CLIENTE-TEST-1",
"vat_cliente": "VAT CLIENTE TEST",
"cliente_finale": "CLIENTE-FINALE-TEST-2",
"vat_cliente_finale": "VAT-CLIENTE-FINALE-TEST",
"data_sottoscrizione_contratto": "8/12/2020",
"data_inizio_attivita": "8/28/2020",
"data_fine_attivita": "8/31/2020",
"stato_ordine": "CHIUSO"
}
},
{
"id": 3,
"referente": {
"name": "Francesco Nicola",
"surname": "Romano",
"complete_name": "Francesco Nicola Romano",
"role": "Operation Manager"
},
"company": {
"name": "DGS S.p.A.",
"VAT": "IT 03318271214",
"BU": {
"name": "Cyber Security",
"code": "CS"
}
},
"dettaglio_ordine": {
"data_inserimento": "2020-08-10",
"commessa": {
"code": "AAA0002"
},
"identificativo_contratto_hyperlink": "LINK-ID-CONTRATTO-TEST",
"tipologia_contratto": "ORDINE",
"presenza_AQ": false,
"identificativo_AQ_hyperlink": "LINK-AQ-TEST",
"accordo_quadro": 12,
"importo_contratto": 122000,
"residuo_AQ": 20000,
"compagine_di_AQ": "COMPAGINE-DI-AQ-TEST",
"quota_percentuale_di_RTI": 20,
"tipologia_di_partecipazione": "GARA PUBBLICA",
"cig": "CIG-TEST-3",
"cliente": "CLIENTE-TEST-3",
"vat_cliente": "XXX123",
"cliente_finale": "CLIENTE-FINALE-TEST-3",
"vat_cliente_finale": "YYY321",
"data_sottoscrizione_contratto": "8/12/2020",
"data_inizio_attivita": "8/28/2020",
"data_fine_attivita": "8/31/2020",
"stato_ordine": "CHIUSO"
}
}
]
}
基本上这是一个对象数组。我最初的想法是 .json 文件中数组中定义的每个 JSON 对象都必须完美映射到 Order 模型接口描述的对象上,因为在我的组件中,我将 orders 变量定义为 Order:
的数组
orders: Order[];
但是好像不是这样的
我的服务 class 正确检索返回数组的信息,但该数组似乎包含 JSON 对象而不是 Order 字段。
为什么?我错过了什么?在模型对象上映射 JSON 对象的正确方法是什么?此外,使用此 JavaScrip\JSON 对象作为避免此步骤的模型对象是否正确或在 Angular 中是否可以接受?
Typescript 不会 修改您的对象。这些类型仅用于更好地理解数据的形状并防止错误。
所以在这一行中:
.then(res => <Order[]>res.data)
您只需告诉打字稿“res.data 的内容属于 Order[] 类型。从现在开始将它们视为此类”。由您来定义合适的类型。
如果您需要映射您的 json 响应以匹配您的类型,您需要做的是:
定义结果类型 (Order
) 和表示您从 api (ApiOrder
)
检索的数据的类型
声明执行转换的方法
const transformOrder = (apiOrder: ApiOrder): Order => {
return { .. your order object ... }
}
- 收到数据后进行转换
.then(res => <ApiOrder[]>res.data)
.then(data: ApiOrder[] => { return data.map(transformOrder); });
我是 Angular 的新手,我很怀疑这种情况的具体情况:
在我的组件代码中我有这样的东西:
orders: Order[];
ngOnInit() {
this.ordersService.getAllOrders().then(orders => {
this.orders = orders;
console.log("RETRIEVED ORDERS: ", orders);
this.loading = false;
});
正如你首先看到的,我正在定义一个 Order 模型对象数组。
然后进入 ngOnInit() 方法我正在使用此 getAllOrders() 服务方法检索此数组:
getAllOrders() {
return this.http.get<any>('assets/json_mock/ordini.json')
.toPromise()
.then(res => <Order[]>res.data)
.then(data => { return data; });
}
这基本上是从 JSON 文件中检索值。
现在...来自 Java 我对它在 Angular\TypeScript 中是否有效有些怀疑。我的想法是我的 ordini.json 文件中定义的对象必须映射到 Order 模型对象上。
所以这是我的订单模型界面:
export interface Referent {
name?: string;
surname?: string;
role?: string;
}
export interface Company {
name?: string;
vat?: string;
bu?: BU;
}
export interface BU {
name?: string;
code?: string;
}
export interface OrderDetails {
dataInserimento?: Date;
commesse?: Array<string>;
identificativoContrattoHyperlink?: string;
tipologiaContratto?: string;
presenzaAQ?: string;
identificativoAQHyperlink?: string;
accordoQuadro?: string;
importoContratto?: number;
residuoAQ?: number;
compagineDiAQ?: number;
quotaPercentualeDiRTI?: number;
tipologiaDiPartecipazione?: string;
cig?: string;
cliente?: string;
vatCliente?: string
clienteFinale?: string;
vatClienteFinale?: string;
dataSottoscrizioneContratto?: string;
dataInizioAttivita?: Date;
dataFineAttivita?: Date;
statoOrdine?: string;
}
export interface Order {
id?: number;
name?: string;
company?: Company;
dettaglioOrdine?: OrderDetails;
}
正如您所见,我有一个 Order 接口,其中包含一些字段(有时定义为其他接口)。
这是我的JSON文件内容:
{
"data": [
{
"id": 1,
"referente": {
"name": "Mario",
"surname": "Rossi",
"complete_name": "Mario Rossi",
"role": "Operation Manager"
},
"company": {
"name": "TEST S.p.A.",
"VAT": "IT 03318271214",
"BU": {
"name": "Digital Solution",
"code": "DS"
}
},
"dettaglio_ordine": {
"data_inserimento": "2020-08-08",
"commessa": {
"code": "AAA0001"
},
"identificativo_contratto_hyperlink": "LINK-ID-CONTRATTO-TEST",
"tipologia_contratto": "ORDINE",
"presenza_AQ": true,
"identificativo_AQ_hyperlink": "LINK-AQ-TEST",
"accordo_quadro": 12,
"importo_contratto": 122000,
"residuo_AQ": 20000,
"compagine_di_AQ": "COMPAGINE-DI-AQ-TEST",
"quota_percentuale_di_RTI": 20,
"tipologia_di_partecipazione": "GARA PUBBLICA",
"cig": "CIG-TEST-1",
"cliente": "CLIENTE-TEST-1",
"vat_cliente": "VAT-CLIENTE",
"cliente_finale": "CLIENTE-FINALE-TEST-1",
"vat_cliente_finale": "VAT-CLIENTE-FINALE",
"data_sottoscrizione_contratto": "8/12/2020",
"data_inizio_attivita": "2020-08-28",
"data_fine_attivita": "2020-08-30",
"stato_ordine": "CHIUSO"
}
},
{
"id": 2,
"referente": {
"name": "Mario",
"surname": "Rossi",
"complete_name": "Mario Rossi",
"role": "Operation Manager"
},
"company": {
"name": "DGS S.p.A.",
"VAT": "IT 03318271214",
"BU": {
"name": "Cyber Security",
"code": "CS"
}
},
"dettaglio_ordine": {
"data_inserimento": "2020-08-09",
"commessa": {
"code": "AAA0002"
},
"identificativo_contratto_hyperlink": "LINK-ID-CONTRATTO-TEST",
"tipologia_contratto": "ORDINE",
"presenza_AQ": false,
"identificativo_AQ_hyperlink": "LINK-AQ-TEST",
"accordo_quadro": 12,
"importo_contratto": 122000,
"residuo_AQ": 20000,
"compagine_di_AQ": "COMPAGINE-DI-AQ-TEST",
"quota_percentuale_di_RTI": 20,
"tipologia_di_partecipazione": "GARA PUBBLICA",
"cig": "CIG-TEST-2",
"cliente": "CLIENTE-TEST-1",
"vat_cliente": "VAT CLIENTE TEST",
"cliente_finale": "CLIENTE-FINALE-TEST-2",
"vat_cliente_finale": "VAT-CLIENTE-FINALE-TEST",
"data_sottoscrizione_contratto": "8/12/2020",
"data_inizio_attivita": "8/28/2020",
"data_fine_attivita": "8/31/2020",
"stato_ordine": "CHIUSO"
}
},
{
"id": 3,
"referente": {
"name": "Francesco Nicola",
"surname": "Romano",
"complete_name": "Francesco Nicola Romano",
"role": "Operation Manager"
},
"company": {
"name": "DGS S.p.A.",
"VAT": "IT 03318271214",
"BU": {
"name": "Cyber Security",
"code": "CS"
}
},
"dettaglio_ordine": {
"data_inserimento": "2020-08-10",
"commessa": {
"code": "AAA0002"
},
"identificativo_contratto_hyperlink": "LINK-ID-CONTRATTO-TEST",
"tipologia_contratto": "ORDINE",
"presenza_AQ": false,
"identificativo_AQ_hyperlink": "LINK-AQ-TEST",
"accordo_quadro": 12,
"importo_contratto": 122000,
"residuo_AQ": 20000,
"compagine_di_AQ": "COMPAGINE-DI-AQ-TEST",
"quota_percentuale_di_RTI": 20,
"tipologia_di_partecipazione": "GARA PUBBLICA",
"cig": "CIG-TEST-3",
"cliente": "CLIENTE-TEST-3",
"vat_cliente": "XXX123",
"cliente_finale": "CLIENTE-FINALE-TEST-3",
"vat_cliente_finale": "YYY321",
"data_sottoscrizione_contratto": "8/12/2020",
"data_inizio_attivita": "8/28/2020",
"data_fine_attivita": "8/31/2020",
"stato_ordine": "CHIUSO"
}
}
]
}
基本上这是一个对象数组。我最初的想法是 .json 文件中数组中定义的每个 JSON 对象都必须完美映射到 Order 模型接口描述的对象上,因为在我的组件中,我将 orders 变量定义为 Order:
的数组orders: Order[];
但是好像不是这样的
我的服务 class 正确检索返回数组的信息,但该数组似乎包含 JSON 对象而不是 Order 字段。
为什么?我错过了什么?在模型对象上映射 JSON 对象的正确方法是什么?此外,使用此 JavaScrip\JSON 对象作为避免此步骤的模型对象是否正确或在 Angular 中是否可以接受?
Typescript 不会 修改您的对象。这些类型仅用于更好地理解数据的形状并防止错误。
所以在这一行中:
.then(res => <Order[]>res.data)
您只需告诉打字稿“res.data 的内容属于 Order[] 类型。从现在开始将它们视为此类”。由您来定义合适的类型。
如果您需要映射您的 json 响应以匹配您的类型,您需要做的是:
定义结果类型 (
检索的数据的类型Order
) 和表示您从 api (ApiOrder
)声明执行转换的方法
const transformOrder = (apiOrder: ApiOrder): Order => {
return { .. your order object ... }
}
- 收到数据后进行转换
.then(res => <ApiOrder[]>res.data)
.then(data: ApiOrder[] => { return data.map(transformOrder); });