哪个 JSON 适配器使 Ember 能够将所有必要的请求传播到服务器以保持模型一致性?
Which JSON adapter enables Ember to propagate all necessary requests to the server to maintain model consistence?
我正在使用 Andy Crum 的 EmberDataModelMaker。
打卡了下面两个类
// app/models/server-item.js
export default DS.Model.extend({
hostName: DS.attr('string'),
syncServers: DS.hasMany('string'),
subscribers: DS.hasMany('string'),
mailHost: DS.attr('string'),
mailHostLogin: DS.hasMany('credentials')
});
// app/models/credentials.js
export default DS.Model.extend({
user: DS.attr('string'),
password: DS.attr('string'),
server: DS.belongsTo('serverItem')
});
它显示了以下三种不同的预期 JSON 格式(顺便说一句,这是一个非常好的功能):
DS.RESTAdapter
"serverItems": [
{
"id": 1,
"hostName": "foo",
"syncServers": [
<stringids>
],
"subscribers": [
<stringids>
],
"mailHost": "foo",
"mailHostLogin": [
<Credentialsids>
]
}
],
"credentials": [
{
"id": 1,
"user": "foo",
"password": "foo",
"server": <ServerItemid>
}
]
DS.ActiveModelAdapter
"serverItems": [
{
"id": 1,
"host_name": "foo",
"sync_server_ids": [
<stringids>
],
"subscriber_ids": [
<stringids>
],
"mail_host": "foo",
"mail_host_login_ids": [
<Credentialsids>
]
}
],
"credentials": [
{
"id": 1,
"user": "foo",
"password": "foo",
"server_id": <ServerItemid>
}
]
DS.JSONAPIAdapter
{
"data": {
"type": "server-items",
"id": "1",
"attributes": {
"HostName": "foo",
"MailHost": "foo",
},
"relationships": {
"SyncServers": {
"data": {
"type": "SyncServers",
"id": <SyncServersid>
}
},
"Subscribers": {
"data": {
"type": "Subscribers",
"id": <Subscribersid>
}
},
"MailHostLogin": {
"data": {
"type": "MailHostLogin",
"id": <MailHostLoginid>
}
}
},
"included": [
{
<sideloadedrelationships>
]
}
}
}
{
"data": {
"type": "credentials",
"id": "1",
"attributes": {
"User": "foo",
"Password": "foo",
},
"relationships": {
"Server": {
"data": {
"type": "Server",
"id": <Serverid>
}
}
},
"included": [
{
<sideloadedrelationships>
]
}
}
}
我将在服务器端(使用 C#、ASP.NET Web API)实现(或者说更改)一些 Web 服务。目前,WebService 已经创建了一个与 DS.RESTAdapter 预期格式非常相似的结果 - 显然,如果我可以在不损害数据完整性的情况下使用它,那将是理想的 - 我可以吗?
如果是,它会授权 Ember Data 发送所有必要的请求以维护服务器上的数据一致性吗?意思是,当用户需要时,客户端是否会向服务器发送 DELETE 请求,不仅针对 ServerItem
,而且针对通过 mailHostLogin
属性 引用的 Credentials
项目删除 ServerItem
?
如果不是:其他两个适配器是否都满足上述一致性要求?我应该实施其他两个中的哪一个 - experiences/recommendations?
您应该选择最适合您的 API 数据结构的适配器作为基础(在这种情况下听起来像 DS.RESTAdapter
)。您可以扩展最适合的适配器和序列化程序以进行任何必要的调整(这可以在应用程序范围内或在每个模型的基础上完成)。
但是,我认为 Ember 数据模型关系(即 belongsTo
和 hasMany
)的绑定方式不会自动导致 "data consistency" 你要找的。如果您的应用程序要求在删除 ServerItem
时删除所有关联的 Credentials
记录,我建议在处理 DELETE ServerItem
API 请求时在服务器端执行该操作。这将带来更好的性能(1 次 HTTP 调用而不是 2 次或 N 次,具体取决于是否可以批量删除凭据)并且由于潜在的网络或其他删除 ServerItem 后删除凭据的调用失败而导致的错误更少。
成功删除 ServerItem 后,您可以遍历它的凭据并从客户端存储中卸载记录,以使其与服务器上的新状态保持同步。就像是:
serverItemCredentials.forEach(function(id) {
if (this.store.recordIsLoaded('credential', id)) {
this.store.unloadRecord(this.store.peekRecord('credential', id));
}
});
我正在使用 Andy Crum 的 EmberDataModelMaker。
打卡了下面两个类
// app/models/server-item.js
export default DS.Model.extend({
hostName: DS.attr('string'),
syncServers: DS.hasMany('string'),
subscribers: DS.hasMany('string'),
mailHost: DS.attr('string'),
mailHostLogin: DS.hasMany('credentials')
});
// app/models/credentials.js
export default DS.Model.extend({
user: DS.attr('string'),
password: DS.attr('string'),
server: DS.belongsTo('serverItem')
});
它显示了以下三种不同的预期 JSON 格式(顺便说一句,这是一个非常好的功能):
DS.RESTAdapter
"serverItems": [
{
"id": 1,
"hostName": "foo",
"syncServers": [
<stringids>
],
"subscribers": [
<stringids>
],
"mailHost": "foo",
"mailHostLogin": [
<Credentialsids>
]
}
],
"credentials": [
{
"id": 1,
"user": "foo",
"password": "foo",
"server": <ServerItemid>
}
]
DS.ActiveModelAdapter
"serverItems": [
{
"id": 1,
"host_name": "foo",
"sync_server_ids": [
<stringids>
],
"subscriber_ids": [
<stringids>
],
"mail_host": "foo",
"mail_host_login_ids": [
<Credentialsids>
]
}
],
"credentials": [
{
"id": 1,
"user": "foo",
"password": "foo",
"server_id": <ServerItemid>
}
]
DS.JSONAPIAdapter
{
"data": {
"type": "server-items",
"id": "1",
"attributes": {
"HostName": "foo",
"MailHost": "foo",
},
"relationships": {
"SyncServers": {
"data": {
"type": "SyncServers",
"id": <SyncServersid>
}
},
"Subscribers": {
"data": {
"type": "Subscribers",
"id": <Subscribersid>
}
},
"MailHostLogin": {
"data": {
"type": "MailHostLogin",
"id": <MailHostLoginid>
}
}
},
"included": [
{
<sideloadedrelationships>
]
}
}
}
{
"data": {
"type": "credentials",
"id": "1",
"attributes": {
"User": "foo",
"Password": "foo",
},
"relationships": {
"Server": {
"data": {
"type": "Server",
"id": <Serverid>
}
}
},
"included": [
{
<sideloadedrelationships>
]
}
}
}
我将在服务器端(使用 C#、ASP.NET Web API)实现(或者说更改)一些 Web 服务。目前,WebService 已经创建了一个与 DS.RESTAdapter 预期格式非常相似的结果 - 显然,如果我可以在不损害数据完整性的情况下使用它,那将是理想的 - 我可以吗?
如果是,它会授权 Ember Data 发送所有必要的请求以维护服务器上的数据一致性吗?意思是,当用户需要时,客户端是否会向服务器发送 DELETE 请求,不仅针对 ServerItem
,而且针对通过 mailHostLogin
属性 引用的 Credentials
项目删除 ServerItem
?
如果不是:其他两个适配器是否都满足上述一致性要求?我应该实施其他两个中的哪一个 - experiences/recommendations?
您应该选择最适合您的 API 数据结构的适配器作为基础(在这种情况下听起来像 DS.RESTAdapter
)。您可以扩展最适合的适配器和序列化程序以进行任何必要的调整(这可以在应用程序范围内或在每个模型的基础上完成)。
但是,我认为 Ember 数据模型关系(即 belongsTo
和 hasMany
)的绑定方式不会自动导致 "data consistency" 你要找的。如果您的应用程序要求在删除 ServerItem
时删除所有关联的 Credentials
记录,我建议在处理 DELETE ServerItem
API 请求时在服务器端执行该操作。这将带来更好的性能(1 次 HTTP 调用而不是 2 次或 N 次,具体取决于是否可以批量删除凭据)并且由于潜在的网络或其他删除 ServerItem 后删除凭据的调用失败而导致的错误更少。
成功删除 ServerItem 后,您可以遍历它的凭据并从客户端存储中卸载记录,以使其与服务器上的新状态保持同步。就像是:
serverItemCredentials.forEach(function(id) {
if (this.store.recordIsLoaded('credential', id)) {
this.store.unloadRecord(this.store.peekRecord('credential', id));
}
});