侧面加载模型后,ember-cli-mirage失去联系

时间:2019-11-12 06:14:14

标签: ember.js ember-cli-mirage

我有以下型号:

// 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
    }
  })
}

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

chrome tools

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

enter image description here

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

2 个答案:

答案 0 :(得分: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,请使用scenarios/default.js将数据创建逻辑放入server.create

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

答案 1 :(得分:0)

好吧,我显然做错了。这是正确进行侧面加载的方法。

  • 由于我的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;
  })

或者可以使用Fixture文件等。

相关问题