Ember.js:直接加载相关模型
我不明白余烬如何加载相关模型 假设这是我的模型:Ember.js:直接加载相关模型,ember.js,ember-data,ember-cli,Ember.js,Ember Data,Ember Cli,我不明白余烬如何加载相关模型 假设这是我的模型: export default DS.Model.extend({ title: DS.attr('string'), description: DS.attr('string'), states: DS.hasMany('state', {async: true}) }) 我把这个装在我的一条外线上。当在ember应用程序中导航(进入嵌套路线)时,通常会为路线提供模型上下文,而不是通过路线的模型挂钩,而是通过指向辅助对象的链接(使用
export default DS.Model.extend({
title: DS.attr('string'),
description: DS.attr('string'),
states: DS.hasMany('state', {async: true})
})
我把这个装在我的一条外线上。当在ember应用程序中导航(进入嵌套路线)时,通常会为路线提供模型上下文,而不是通过路线的模型挂钩,而是通过指向辅助对象的链接(使用动态分段时,将忽略模型挂钩)。当目标路由的模板中有类似于{{{#each model.states as | state |}}
的内容时,ember将自动从状态模型(在这种情况下)加载相关的模型入口。(如何以及为什么?-仅仅因为模板中的每个
当直接访问动态路由时,不会给出模型,并且会调用动态路由的模型钩子。因此加载我的模型很简单:只需覆盖模型钩子并使用url参数加载记录(返回this.store.find('item',{title:params.item_title})
)。但不会加载任何相关模型。我如何手动执行此操作?默认情况下,ember执行此操作的方式是什么(以及何时)?ember如何知道自动获取关系?
通过将async
选项设置为true
或false
,ember data允许您定义关系(当前仅属于和拥有多个
),ember data将直接在响应JSON中使用relationships对象,或者不使用。您有async:true
(这是一种非常常见且受支持的处理关系的方法),因此ember data假定在JSON响应中,它会获得状态的id
s,但不一定是状态本身
如果您将您的hasMany
定义为async:true
,则它总是返回承诺。这意味着,如果您这样做:
this.get("item").get("states")[0]
将不起作用,因为get(“states”)
不会返回数组,但承诺获取此数组。但是,手柄是智能的(与余烬的get
和set
方法一样),它可以找出什么是承诺,并在使用其内容之前等待解决。因此,如果模板包含:
{{#each model.states as |state|}}
Handlebar发现状态
是承诺,等待它解析,解析后它们将其内容用作数组。使用belongsTo
方法可以发现非常类似的行为。假设您的项目
有一个状态
,如果您按如下方式使用代码:
this.get("item.state.somePropertyOfState")
即使您没有获取状态
,并且当前不知道somePropertyOfState
值是什么,emberget
也会发现这是一个承诺,并自动为您获取它
如何手动获取关系?
有两种方法可以做到这一点
第一个是在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
});
第二,您可以让余烬自动为您做这件事,正如我前面所描述的(例如,通过模板)
第三,您可以使用称为sideload的机制将关系与响应一起发送。这将显著减少API请求的数量。当您允许ember获取关系时,ember将对每个关系对象执行一个请求,这意味着如果您有属于项的十个状态
,API将被命中十次。但是,如果您在获取项
时避开状态
,则请求将只发送一次。若要获取有关该项的详细信息,请参阅
抱歉发了这么长的帖子,但我希望我能澄清一下。非常感谢!非常有用。但是你说如果模板中使用了某个值,ember会自动加载。在我的应用程序中,它不会!-加载了一个模型-链接到嵌套路由-使用类似于{model.relatedrecords.title}的东西在该模板中-什么都没有发生(甚至不是rest请求)(假设我的第一个加载的模型得到了一个成员,如relatedrecords{hasmany to Other model})Change.than->。然后使用第一种方法,如何遍历states?在promise处理程序中可用的states变量可以作为数组进行迭代。