0

我有以下模型(针对这个问题进行了简化):

App.Manager = DS.Model.extend({
  name: DS.attr('string'),

  teamMembers: DS.hasMany('App.Employee')
});

当这个模型被加载(比如说App.Manager.find(1))时,它会从我的服务器返回一个 teamMembers 数组:

[10, 11, 12]

我的视图需要来自这些团队成员的数据,因此 Ember 会findMany()按预期自动通过请求加载它们。我遇到的问题是员工 #11 不存在。findMany()服务器仅使用员工 10 和 12响应请求:

{
  "employees": [
    {
      "id":   10,
      "name": "John Doe"
    },

    {
      "id":   12,
      "name": "Jane Doe"
    }
}

但是,Ember-Data 似乎仍然为员工 11 保留了一个空的(且已实现的)承诺,即使该员工的数据从未返回。所以现在当我的视图呈现时,我得到一个有 3 行的表(每个员工一个),其中一行是完全空白的(因为记录是空的)。

检查记录的状态:

{
    isLoaded:  true,
    isDirty:   false,
    isSaving:  false,
    isDeleted: false,
    isError:   false,
    isNew:     false,
    isValid:   true
}

所以,我不确定如何在不检查我需要的每个属性是否为空的情况下将这个空记录保留在我的视野之外。服务器有没有办法响应告诉 ember 不要履行这个承诺?有没有办法配置 ember 以识别何时不返回数据?


编辑:我意识到,理想情况下,服务器不会为不存在的员工返回 ID。但现实情况是,有时数据不可靠或维护不善。如果员工 11 返回的数据不准确,那么我同意问题出在数据和/或服务上,而不是 Ember。但是,在这种情况下,员工 11 没有返回不准确的数据,它根本没有返回任何数据。在这种情况下,在我看来,ember 至少应该设置一个标志(即 isValid:false),指示记录为空/无效/未找到,如果不是完全销毁对空记录的引用。

编辑 2:这是Github 上的一个问题

4

1 回答 1

1

很难说 Ember-data 是否应该尝试为这种情况提供一些魔力。通过在关系中包含 ID,您有效地告诉 ember-data 它存在。

REST 适配器(从服务器请求数据)与序列化程序(将响应数据转换为模型)是分开的,因此很难知道是否所有请求的数据都实际返回了。如果您不介意将适配器紧密耦合到序列化程序,您可以验证服务器是否为您提供了您所期望的一切。

解决方法:

将验证属性添加到您的员工模型以用作一种伪状态。这应该默认为 false 或 null 并且您的 API 返回的每条记录都必须覆盖它。相当骇人听闻。幸运的是,可以使用现有属性(例如员工姓名)来实现相同的概念。

if (App.Employee.find(11).get('name') != null) { dance('thriller'); }

如果您将上述概念视为标准验证要求,您可以选择在模型或序列化程序中实现它。

于 2013-02-22T04:33:31.477 回答