1

在我的应用程序中,我有一个 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"
        ]
    }
]

我们使用侧载来检索指标,其返回数据如下所示:

[
    {
        id: "reach-13",
        value: 3,
        label: "reached"
    },
    {
        id: "reply-13",
        value: 2,
        label: "reply"
    },
]

这个过程运行良好,没有任何缺陷。但由于可能有大量消息,每条消息都有一组指标,因此显示指标的时间可能是 3 秒或更长时间。在每条消息上,我想添加一个加载微调器来代替指标,然后在该消息的指标返回后将其删除。我已经添加了微调器,但是一旦度量集合返回给客户端,我就无法弄清楚如何删除它。

Ember 是否在控制器上有一个事件或方法,当整个数据集合返回给客户端时会触发?

我知道模型生命周期有这样的钩子,但我不关心单个模型,我正在寻找更高的东西,用于整个指标集(对于每条消息)

这是现在正在发生的事情的快速截屏视频。 http://screencast.com/t/CIx3Aikck3

4

1 回答 1

0

每个模型实例都有自己的模型生命周期钩子MessageMetric此外,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>

ManyArrays 也有一个在设置为 truedidLoad时触发的事件isLoaded,但是对于您所描述的内容,您不需要它。

于 2013-07-20T16:20:27.433 回答