Ember.js: 直接加载相关模型

Ember.js: Loading related models directly

我不明白ember如何加载相关模型。

假设这就是我的模型:

export default DS.Model.extend({
  title: DS.attr('string'),
  description: DS.attr('string'),
  states: DS.hasMany('state', {async: true})
})

我在我的外部路线上加载了这个。当通过 ember-app 导航(进入嵌套路由)时,模型上下文通常不是通过路由的模型钩子而是通过 link-to 帮助器(当使用动态-段,模型挂钩将被忽略)。当目标路由在其模板中包含诸如 {{#each model.states as |state|}} 之类的内容时,ember 将自动从(在这种情况下)状态模型中加载相关模型条目。 (如何以及为什么?- 仅仅因为模板中的 each

直接访问动态路由时,不给出模型,会调用动态路由的model-hook。所以加载我的模型很容易:只需覆盖模型挂钩并使用 url 参数 (return this.store.find('item', {title: params.item_title})) 加载记录。但是不会加载相关模型。我如何手动执行此操作以及 ember 默认情况下(以及何时)执行此操作的方式?

Ember 如何知道自动获取关系?

ember-data 允许您定义关系(目前只有 belongsTohasMany),async 选项设置为 truefalse.基于此选项,在从 API(通过 find 方法)获取模型后,ember-data 将直接在响应 JSON 中或不期望关系对象。您有 async: true(这是处理关系的一种常见且受支持的方式),因此 ember-data 假定在您的 JSON 响应中它获得了 id 状态,但不一定是各州本身。

如果您将 hasMany 定义为 async: true,它 总是 return 的承诺。这意味着,如果你做这样的事情:

this.get("item").get("states")[0] 

不会工作,因为 get("states") 不会 return 一个数组,而是获取这个数组的承诺。然而,Handlebars 是智能的(如 Ember 的 getset 方法),它可以找出什么是 promise 并等待它解决,然后再使用它的内容。因此,如果您的模板包含:

{{#each model.states as |state|}}

Handlebars 发现 states 是 promise,等待它解析,解析后他们将其内容用作数组。使用 belongsTo 方法可以找到非常相似的行为。假设你的item有一个state,如果你使用代码如下:

this.get("item.state.somePropertyOfState")

即使您没有获取 state 并且当前您不知道 somePropertyOfState 值是什么,ember get 也会发现这是一个承诺并自动为您获取。

如何手动获取关系?

有几种方法可以做到这一点。

第一个是在 ember 代码中显式获取它们:

this.get("item.states").then(function(states) {
  # now you have fetched the states that the item has, and moreover
  # they are accessible in states variable
});

其次,您可以让 Ember 像我之前描述的那样自动为您完成(例如通过模板)。

第三,您可以使用称为侧载的机制将关系与您的响应一起发送。这将显着减少 API 请求的数量。当您允许 ember 获取您的关系时,ember 对每个关系对象执行一个请求,这意味着如果您有十个 states 属于 item,API会被击中十次。但是,如果您在获取 item 时旁路 states,则请求将只发送一次。 Take a look here 以获取更多相关信息。

很抱歉 post,但我希望我能澄清一点。