在我的应用程序中,我有一个1到M的关系,如下所示:
Social.Message = DS.Model.extend({
created: DS.attr("date"),
text: DS.attr("string"),
metrics: DS.hasMany("Social.Metric"),
});
Social.Metric = DS.Model.extend({
label: DS.attr('string'),
value: DS.attr('number'),
message: DS.belongsTo('Social.Message'),
});
当Ember Data调用检索消息时,数据包如下所示:
[
{
"id": 13,
"created": "2013-05-20T21:35:56Z"
"text": "You got to let the roots grow deep, and stop worrying about the leaves",
"metrics": [
"reach-13",
"click-13"
]
}
]
我们正在使用sideloading然后检索指标,其返回数据如下所示:
[
{
id: "reach-13",
value: 3,
label: "reached"
},
{
id: "reply-13",
value: 2,
label: "reply"
},
]
这个过程很有效,没有任何缺陷。但是因为可能存在大量消息,每个消息都有一组指标,所以显示指标的时间可以是3秒或更长。在每条消息上,我想添加一个加载微调器来代替指标,然后在返回该消息的指标后将其删除。我已经添加了微调器,但是一旦指标集合返回给客户端,就无法弄清楚如何删除它。
当将整个集合数据返回给客户端时,Ember是否在Controller上有一个事件或方法?
我知道Model lifecycle has hooks like this,但我不关心单个模型,我正在寻找更高的内容,针对整套指标(针对每条消息)
这是一个关于现在正在发生的事情的快速截屏视频。 http://screencast.com/t/CIx3Aikck3
答案 0 :(得分:0)
每个Message
和Metric
模型实例都有自己的模型生命周期挂钩。此外,实现DS.ManyArray
关系的DS.hasMany
s也具有isLoaded
属性(整个数组一个)。
所以钥匙在你的车把模板中。将度量标准包含在isLoaded
条件中,而不是整个消息中。在消息的上下文中:
<div>{{created}}</div>
<div>{{text}}</div>
<div>
{{#if metrics.isLoaded}}
{{#each metric in metrics}}
{{! Display metric here. }}
{{/each}}
{{else}}
<img src='spinner.gif'>
{{/if}}
</div>
ManyArray
还有一个didLoad
事件,当isLoaded
设置为true时会被触发,但对于您所描述的内容,您不应该需要它。