Mar*_*c M 6 ember.js ember-data ember-cli
我不明白ember是如何加载相关模型的.
让我们说我的模型:
export default DS.Model.extend({
title: DS.attr('string'),
description: DS.attr('string'),
states: DS.hasMany('state', {async: true})
})
Run Code Online (Sandbox Code Playgroud)
我加载了我的外部路线.当通过ember-app(嵌套路由)导航时,模型上下文通常是为路由提供的,而不是路由的模型钩子,而是链接到帮助器(当使用动态段时,模型钩子将是忽略).当目标路径在其模板中有某些内容时{{#each model.states as |state|}},ember将自动加载相关模型 - 从(在这种情况下)状态模型.(如何以及为什么? - 仅仅因为each模板中的?
直接访问动态路由时,不会给出模型,并且将调用动态路由的模型钩子.因此加载我的模型很简单:只需覆盖模型钩子并使用url参数(return this.store.find('item', {title: params.item_title}))加载记录.但是不会加载任何相关模型.我怎样才能手动完成,默认情况下ember执行的方式是什么(以及何时)?
Kub*_*iał 12
ember-data允许您定义关系(当前仅belongsTo和hasMany),async选项设置为true或false.基于此选项,在从API(通过find方法)获取模型之后,ember-data将直接在响应JSON中预期关系对象.你有async: true(这是一种常见且受支持的处理关系的方式),因此ember-data假定在你的JSON响应中它获得了id状态,但不是必然的状态本身.
如果定义hasManyas async: true,它总是返回promise.这意味着,如果你做这样的事情:
this.get("item").get("states")[0]
Run Code Online (Sandbox Code Playgroud)
将无法工作,因为get("states")不会返回数组,但是获取此数组的承诺.但是,把手是聪明(为get和set灰烬的方法),它可以找出是一种承诺,并等待它使用其内容之前解决.因此,如果您的模板包含:
{{#each model.states as |state|}}
Run Code Online (Sandbox Code Playgroud)
Handlebars发现这states是承诺,等待它解决,并在解决后将其内容用作数组.使用belongsTo方法可以找到非常相似的行为.假设你item有一个state,如果你使用如下代码:
this.get("item.state.somePropertyOfState")
Run Code Online (Sandbox Code Playgroud)
即使你没有拿到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
});
Run Code Online (Sandbox Code Playgroud)
其次,你可以让Ember自动为你做,就像我之前描述的那样(例如通过模板).
第三,您可以使用称为sideload的机制发送与您的响应的关系.这将显着减少API请求的数量.当你允许ember获取你的关系时,ember每个关系对象执行一个请求,这意味着如果你有10个states属于item,那么API会被命中十次.但是,如果你states在获取的同时item,请求将只发送一次.看看这里获取更多信息.
很抱歉很长的帖子,但我希望我澄清一点.
| 归档时间: |
|
| 查看次数: |
1584 次 |
| 最近记录: |