哪个 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 数据模型关系(即 belongsTohasMany)的绑定方式不会自动导致 "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)); } });