【问题标题】:What array name does Ember Data expect for sub directory models?Ember Data 期望子目录模型的数组名称是什么?
【发布时间】:2015-08-04 18:29:17
【问题描述】:

我最近开始学习 Ember 并使用 Ember-CLI,因此我不太了解 Ember 数据以及它对我的应用子目录中的关系所期望的数组名称。

// models/server.js
import DS from 'ember-data';

export default DS.Model.extend({
  serverHistory: DS.hasMany("history/server", { async: true })
});

// models/history/server.js
import DS from 'ember-data';

export default DS.Model.extend({
  server: DS.belongsTo("server", { async: true })
});

我已尝试从我的 API 返回这些名称

server_historys_ids
server_histories_ids
history_server_ids
history_servers_ids

但我没有在我的应用程序中看到对服务器历史记录的 XHR 请求。服务器本身可以正常获取。

更新

我更改了我的关系名称,API 正在返回历史 ID,但我仍然没有收到历史 json 请求,即使我尝试在模板中使用 each。游戏关系数据可在模板中访问,请求成功。

// models/server.js
import DS from 'ember-data';

export default DS.Model.extend({
  // attr's here.. not relevant

  // Relationships
  game: DS.belongsTo("game", { async: true }), // works
  serverHistories: DS.hasMany("history/server", { async: true }) // doesn't make a request like game does.
});

我也有一个adapter/history/server.js,但它只是告诉使用什么命名空间 - “api”。

更新 2

我认为问题可能出在我将数据调用到模型的方式上。

// routes/server/view/index.js
import Ember from 'ember';

export default Ember.Route.extend({
  model: function() {
    var parentModel = this.modelFor("server.view");

    return this.store.query("server", { server_address: parentModel.server_address });
    // return this.store.find("server", 1);
  }
});

为什么当我使用带有 id 的 find 时它会更新模板数据,而当我使用带有参数的查询时它却不更新?

更新 3

所以我解决了我的findquery 问题,这是我的工作方式:https://stackoverflow.com/a/31831667/1814027

关系问题仍然存在。我在 Ember 工具栏中没有看到 serverHistory 数据,也没有向 API 发出请求。

【问题讨论】:

  • 我建议不要将模型放在子目录中。痛苦是不值得的。
  • 那我该如何改进我的模型和路线?
  • 致@torazaburo:我正在广泛使用命名空间模型而没有感到任何痛苦。此外,我对结构化模型感到满意。
  • 更新了我的问题,请参阅“更新 2”。
  • 当我从我的 api 返回 ¨server_history¨ { "servers":.., "server_history":.. } Ember 工具栏显示服务器历史数据存在。所以我的问题还是一样:如果我只返回 server_history_ids,为什么 Ember 不通过请求加载服务器历史记录?如果我将它们与服务器请求一起返回,它会很好地获取 server_history 数据。

标签: ember.js ember-data ember-cli


【解决方案1】:

我相信serverHistoryhasMany 的反传统名称,而应该改为serverHistories

export default DS.Model.extend({
  serverHistories: DS.hasMany("history/server", { async: true })
});

那么在 ActiveModelAdapter 预期 server 有效载荷的情况下是:

{"server": {"id": 1, "server_history_ids": [1,2,3]}}

这不取决于serverHistory 是命名空间模型这一事实,它仅取决于关系名称。

例如模型:

// models/server.js
import DS from 'ember-data';

export default DS.Model.extend({
  bars: DS.hasMany("history/server", { async: true })
});

预期的有效载荷是:

 {"server": {"id": 1, "bar_ids": [1,2,3]}}

更新 工作 ember-cli 示例:https://github.com/artych/so_ember_data_subdir

【讨论】:

  • 我将 hasMany 名称更改为 serverHistories。开发工具显示已发出服务器 XHR 请求(包括 server_history_ids),但未发出历史请求。我在我的模板中使用 {{#each model.serverHistories}} (即使这种方式已被弃用,它应该可以工作)。我在网络选项卡中没有看到任何历史请求,也没有在 ember 工具栏中看到历史数据。可能是什么问题?
  • 尝试在 afterModel 中手动解析model.serverHistories(这样你要么看到请求要么看到错误)。 // 在服务器路由中 afterModel: function(server) { server.get('serverHistories').then(function(histories) { self.controllerFor('server').set('serverHistories', histories); }, function(错误){ console.log(错误); }); }
  • 我可以修改代码以在 setupController 中工作吗?我尝试使用您的代码,但它没有返回任何错误或请求(我不得不将 controllerFor 修改为('server.view.index'))
  • 这很奇怪...console.log(历史)? PS:afterModel 是解决依赖模型的 promice 的正确位置。
  • 可能之前已经获取了所需的serverHistories?如果是这样,则不会在 server.get('serverHistory') 上请求它们
【解决方案2】:

Artych 的回答帮助我走上了正确的道路,但 Ember 不想识别 server_history_ids,所以我只是将 hasMany 关系重命名为 histories 并从我的 API 返回 histories: []。现在它起作用了.. 不知道为什么但它起作用了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多