我有以下模型(针对此问题进行了简化):
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不会返回不准确的数据,而是返回 NO data 。在这种情况下,在我看来,像ember应该至少设置一个标志(即isValid:false),表明记录是空的/无效/未找到,如果不是只是扁平,则完全破坏对空记录的引用。
编辑2 :这是Issue on Github
答案 0 :(得分:1)
很难说Ember数据是否应该试图为这种情况提供一些魔力。通过在关系中包含ID,您已经有效地告知了它存在的数据。
REST适配器(从服务器请求数据)与序列化程序(将响应数据转换为模型)分开,因此很难知道是否实际返回了所有请求的数据。如果您不介意将适配器与串行器紧密耦合,则可以验证服务器是否为您提供了所需的一切。
解决方法:强>
向您的员工模型添加验证属性,以用作一种伪状态。这应该默认为false或null,并且API返回的每个记录都必须覆盖它。相当hackish。幸运的是,使用现有属性(例如员工姓名)可以实现相同的概念。
if (App.Employee.find(11).get('name') != null) { dance('thriller'); }
如果您将上述概念视为标准验证要求,您可以选择在模型或序列化器中实现它。