Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js:直接加载相关模型_Ember.js_Ember Data_Ember Cli - Fatal编程技术网

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
值是什么,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
});
第二,您可以让余烬自动为您做这件事,正如我前面所描述的(例如,通过模板)

第三,您可以使用称为sideload的机制将关系与响应一起发送。这将显著减少API请求的数量。当您允许ember获取关系时,ember将对每个关系对象执行一个请求,这意味着如果您有属于
项的十个
状态
,API将被命中十次。但是,如果您在获取
时避开
状态
,则请求将只发送一次。若要获取有关该项的详细信息,请参阅


抱歉发了这么长的帖子,但我希望我能澄清一下。

非常感谢!非常有用。但是你说如果模板中使用了某个值,ember会自动加载。在我的应用程序中,它不会!-加载了一个模型-链接到嵌套路由-使用类似于{model.relatedrecords.title}的东西在该模板中-什么都没有发生(甚至不是rest请求)(假设我的第一个加载的模型得到了一个成员,如relatedrecords{hasmany to Other model})Change.than->。然后使用第一种方法,如何遍历states?在promise处理程序中可用的states变量可以作为数组进行迭代。