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 允许您定义关系(目前只有 belongsTo
和 hasMany
),async
选项设置为 true
或 false
.基于此选项,在从 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 的 get
和 set
方法),它可以找出什么是 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,但我希望我能澄清一点。
我不明白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 允许您定义关系(目前只有 belongsTo
和 hasMany
),async
选项设置为 true
或 false
.基于此选项,在从 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 的 get
和 set
方法),它可以找出什么是 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,但我希望我能澄清一点。