仅发送 Angular 中嵌套模型的模型 PK(或任何其他字段)
Send just the model PK (or any other field) for nested model in Angular
具有以下示例模型:
interface User {
id: string
organization: Organization
}
interface Organization {
id: string
}
当我发送请求时,例如:
const user = new User("abc", new Organization("xyz"))
httpClient.post<User>(url, user)
可以理解,看起来像这样:
{
"id": "abc",
"organization": {
"id": "xyz"
}
}
我怎样才能发送如下所示的请求?
{
"id": "abc",
"organization": "xyz"
}
我希望在 HttpClient
中有某种机制来转换请求,但我找不到任何东西。
另一种方法是将 User
转换为普通 JS 对象并对其进行操作,但我不知道该怎么做:
const user = new User("abc", new Organization("xyz"))
const data = Object.assign({}, user);
data.organization = data.organization.id; // error, can’t assign string to Organization
所以data
仍然是一个User
,而不是一个普通的JS对象。
实现它的最佳方法是什么?
So data is still a User, not a plain JS object.
您正在创建一个 User 实例来发送数据,对象数据的类型始终为 User
。
如果你想发送普通对象,解构对象并创建一个对象字面量:
const org = new Organization("xyz"),
user = new User("abc", {organization: org.organization.id}),
{id, organization} = user,
payload = {id, organization};
// why do you need to create org or user if you can directly assign and create an object like this
// const payload = {id: "abc" , organization: "xyz" };
httpClient.post<User>(url, payload)
我找到了一种解决方案,但不是 100% 满意。暂时不接受,万一有人能提供更好的呢
编辑:标记为已接受的答案。
const user = new User("abc", new Organization("xyz"));
// clone the `user` object as I don’t want to modify the original
// (this step is optional)
const data = Object.assign({}, user);
// overwrite the `organization` property on the object
// with the value of `organization.id`
Object.assign(data, { organization: data.organization.id });
httpClient.post<User>(url, data)
为了保持干净,我将它作为方法添加到 User
class:
class User
{
constructor(
id: string,
organization: Organization
) { }
asRequestData()
{
const data = Object.assign({}, this);
Object.assign(data, { organization: data.organization?.name });
return data;
}
}
httpClient.post<User>(url, user.asRequestData())
具有以下示例模型:
interface User {
id: string
organization: Organization
}
interface Organization {
id: string
}
当我发送请求时,例如:
const user = new User("abc", new Organization("xyz"))
httpClient.post<User>(url, user)
可以理解,看起来像这样:
{
"id": "abc",
"organization": {
"id": "xyz"
}
}
我怎样才能发送如下所示的请求?
{
"id": "abc",
"organization": "xyz"
}
我希望在 HttpClient
中有某种机制来转换请求,但我找不到任何东西。
另一种方法是将 User
转换为普通 JS 对象并对其进行操作,但我不知道该怎么做:
const user = new User("abc", new Organization("xyz"))
const data = Object.assign({}, user);
data.organization = data.organization.id; // error, can’t assign string to Organization
所以data
仍然是一个User
,而不是一个普通的JS对象。
实现它的最佳方法是什么?
So data is still a User, not a plain JS object.
您正在创建一个 User 实例来发送数据,对象数据的类型始终为 User
。
如果你想发送普通对象,解构对象并创建一个对象字面量:
const org = new Organization("xyz"),
user = new User("abc", {organization: org.organization.id}),
{id, organization} = user,
payload = {id, organization};
// why do you need to create org or user if you can directly assign and create an object like this
// const payload = {id: "abc" , organization: "xyz" };
httpClient.post<User>(url, payload)
我找到了一种解决方案,但不是 100% 满意。暂时不接受,万一有人能提供更好的呢
编辑:标记为已接受的答案。
const user = new User("abc", new Organization("xyz"));
// clone the `user` object as I don’t want to modify the original
// (this step is optional)
const data = Object.assign({}, user);
// overwrite the `organization` property on the object
// with the value of `organization.id`
Object.assign(data, { organization: data.organization.id });
httpClient.post<User>(url, data)
为了保持干净,我将它作为方法添加到 User
class:
class User
{
constructor(
id: string,
organization: Organization
) { }
asRequestData()
{
const data = Object.assign({}, this);
Object.assign(data, { organization: data.organization?.name });
return data;
}
}
httpClient.post<User>(url, user.asRequestData())