【问题标题】:Rendering models from an ember-data store, using a http-mock server and RESTAdapter fails使用 http-mock 服务器和 RESTAdapter 从 ember-data 存储渲染模型失败
【发布时间】:2015-04-24 02:08:10
【问题描述】:

我收到了一些关于使用简单模型将 ember-data 连接到 http-mock 的问题。我想加载一个包含属性的 API,并将它们呈现为页面上的列表。

当导航到下面描述的/properties/ 路由时,这是抛出的错误:

Error: Not Found
    at ember$data$lib$system$adapter$$Adapter.extend.ajaxError (rest-adapter.js:714)
    at ember$data$lib$system$adapter$$Adapter.extend.ajax.Ember.RSVP.Promise.hash.error (rest-adapter.js:789)
    at jQuery.Callbacks.fire (jquery.js:3143)
    at Object.jQuery.Callbacks.self.fireWith [as rejectWith] (jquery.js:3255)
    at done (jquery.js:9311)
    at XMLHttpRequest.jQuery.ajaxTransport.send.callback (jquery.js:9713)

模板不渲染。

这是我所做的:

  1. 添加了property 模型:
import DS from 'ember-data';

export default DS.Model.extend({
    title: DS.attr('string'),
    date_added:  DS.attr('date')
});
  1. 添加了如下所示的“routes/properties.js”:
import Ember from 'ember';

export default Ember.Route.extend({
  model: function() {
    return this.store.find('property');
  }
});
  1. app.js中添加了一个应用适配器:
App.ApplicationAdapter = DS.RESTAdapter.extend({
  namespace: 'api',
  host: 'http://localhost:4200/'
});
  1. 使用生成器ember g http-mock property 生成模拟服务器。这是来自我的server/mocks/property.js 的相关sn-p:
propertyRouter.get('/', function(req, res) {
  res.send({
    'property': [{
      id: 1,
      title: "Apartament cu 4 camere ultracentral doar pentru pretențioși"
    },(...)]
  });
});

请注意,curl -H "ContentType:application/json" http://localhost:4200/api/property/ 就像一个魅力。

  1. 我有一条路线,this.route("properties", { path: '/properties'});,它呈现templates/properties.hbs,我尝试在该模板中显示所有属性,如下所示:
{{#each property as |p|}}
  <div class="property">
    {{p.title}}
  </div>
{{/each}}
  1. 如果在2.,我将return this.store.find('property'); 替换为return [1,2,3],它将不再中断,并且我能够迭代该集合。然后,我发现 this.store.find 是导致问题的原因。

知道如何处理这个问题吗?您需要任何其他设置/代码 sn-ps 吗?

ember/ember-data 的版本是 "ember": "1.11.1", "ember-data": ">= 1.0.0-beta.16.1",

【问题讨论】:

  • 在浏览器中打开开发工具并进入网络选项卡,生成的请求的属性是什么?
  • Ember-data 自动使用变形器进行复数。您的节点模拟应该响应 /properties,而不是 /property
  • @givanse 有 2 个请求是 404 与 Cannot GET /properties。由于我将 RESTAdapter 配置为使用 /api/ 来处理命名空间请求,我不明白为什么它不寻找 /api/properties
  • @BriscBogdan 好点,我改变了它,以便模拟服务器响应 /api/properties/,仍然没有骰子。

标签: ember.js ember-data


【解决方案1】:

正如我所怀疑的,我正在配置的 REST 适配器被配置忽略了。我通过声明一个适配器并在创建App 对象时将其作为参数传递来解决了这个问题。

var customRESTAdapter = DS.RESTAdapter.extend({
  namespace: 'api',
  host: 'http://localhost:4200'
});

App = Ember.Application.extend({
  modulePrefix: config.modulePrefix,
  podModulePrefix: config.podModulePrefix,
  Resolver: Resolver,
  ApplicationAdapter: customRESTAdapter,
});

请注意,3. 之前的代码完全不起作用,尽管官方文档中至少有 3 个地方引用了它。由于我刚刚开始接触 Ember,这有点令人失望,我不确定文档的最新程度,但要小心。

这与@BriscBogdan 提到的 rember-data 的自动变形一起解决了我的问题。

【讨论】:

  • ember-cli 文档现在比 emberjs 文档好。我将适配器保留在典型位置并刚刚导入它,但我仍然得到 404。感谢您发布这个问题。这非常有帮助。编辑:如果您查看ember-cli.com/#testing,他们会展示如何设置模拟。我认为您的问题是当 ember-cli 期望您导入对象时,您仍在使用全局命名空间 APP
  • 是的,ember-cli 有很好的文档记录,我喜欢在自己编写任何东西之前使用它来生成代码,真的可以让您更好地组织应用程序。
【解决方案2】:

问题似乎是您在定义适配器时尝试使用全局命名空间APP 而不是导出模块。 Ember 期望 properties 的适配器在 app/adapters/property.coffee 中定义。它应该类似于:

import DS from 'ember-data';

export default DS.RESTAdapter.extend({
  namespace: 'api',
  host: 'http://localhost:4200'
});

然后,从您的 app.js 中删除 ApplicationAdapter 行:

App = Ember.Application.extend({
  modulePrefix: config.modulePrefix,
  podModulePrefix: config.podModulePrefix,
  Resolver: Resolver
});

感谢您发布此问题。我被困在同一点上,这确实有助于了解您所做的事情。

【讨论】:

  • 实际上是的,好点,使用模块来执行此操作要干净得多,而不是阻塞 App 命名空间。稍后我会试一试,如果我能正常工作,请将您的答案标记为正确。
猜你喜欢
  • 2013-09-09
  • 1970-01-01
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多