当模型被侧载时,ember-cli-mirage 失去关系

Posted

技术标签:

【中文标题】当模型被侧载时,ember-cli-mirage 失去关系【英文标题】:ember-cli-mirage loses relationship when models are sideloaded 【发布时间】:2019-11-12 06:14:14 【问题描述】:

我有以下型号:

// venue.js
export default Model.extend(
  name: DS.attr('string')
);

// web.js
export default Model.extend(
  webname: DS.attr('string'),
  venue: DS.belongsTo('venue', async: false)
);

我使用RESTAdapter。我将 Mirage 配置定义如下:

// serializers/application.js
import  RestSerializer  from 'ember-cli-mirage';

export default RestSerializer.extend(
);

// config.js
export default function() 
  this.get('/webs', schema => 
    let venue = schema.venues.create(name: 'venue name');
    let web = schema.webs.create(
      webname: 'web name',
      venue: venue
    );


    return 
      web: web,
      venue: venue
    
  )


这个模型侧载是我们应用程序的一部分,所以我必须使用它。无论如何,您可以在这里看到响应很好,即它正确识别了外键等:

但是当我收到回复时,我无法通过网络访问该场地 - 它是 null。余烬检查员确认:

有没有人知道我在获取数据时如何保持这种关系?

【问题讨论】:

【参考方案1】:

很高兴您找到include!那里的想法是,是否包括关联取决于请求。例如,对于 JSON:API,许多应用程序将使用 query param includes 来指定来自客户端的包含。其他应用程序将通过默认服务器端包含发送其服务器,这就是 include 密钥的用途。

还要注意include 可以是一个函数,如果你想要更多的动态行为。您可以check out the docs 获取一些示例。

最后一点 - 您的 get 处理程序确实应该返回 Mirage 数据库中已有的内容,而不是创建新资源然后返回它们。这样,您的应用的行为将与生产环境中的行为更加相似。

所以不是

this.get('/webs', schema => 
  let venue = schema.venues.create(name: 'venue name', id: 100);
  let web = schema.webs.create(
    webname: 'web name',
    venueId: 100
  );

  return web;
)

试试

this.get('/webs', schema => 
  return schema.webs.all().models[0]
)

返回第一个模型(如果端点应该返回一个集合,则返回schema.webs.all())。然后,使用您的起始数据为 Mirage 播种,使用 server.create 将您的数据创建逻辑放入 scenarios/default.js

// scenarios/default.js
export default function(server) 
  let venue = server.create('venue', name: 'venue name', id: 100);
  server.create('web', 
    venue,
    webname: 'web name'
  );

【讨论】:

【参考方案2】:

好吧,显然我做错了。以下是正确执行侧载的方法。

由于我的web 需要侧载venue,我通过调用ember g mirage-serializer web 创建了一个新的特定于模型的序列化程序。然后我可以通过include 字段指定应该与主实体一起加载的关系:
// serializers/web.js
import ApplicationSerializer from './application';

export default ApplicationSerializer.extend(
  include: ['venue'],
);

那么config.js可以改成
// config.js
  this.get('/webs', schema => 
    let venue = schema.venues.create(name: 'venue name', id: 100);
    let web = schema.webs.create(
      webname: 'web name',
      venueId: 100
    );

    return web;
  )

// OR

  this.get('/webs', schema => 
    let venue = schema.venues.create(name: 'venue name', id: 100);
    let web = schema.webs.create(
      webname: 'web name',
      venue: venue
    );

    return web;
  )

或者可以使用夹具文件等。

【讨论】:

以上是关于当模型被侧载时,ember-cli-mirage 失去关系的主要内容,如果未能解决你的问题,请参考以下文章

Ember 在第一次请求后不按 id 请求模型

Ember 数据模型中的计算属性不适用于 ember-cli-mirage 模型

如何在 ember-cli-mirage 中创建对象?

Ember:访问模板中的侧载模型关系数据

进度条不隐藏是当数据在片段中的recyclerview中加载时

当视图在iOS中加载时如何在缩放时显示用户当前位置?