1

我正在考虑将 Ember.js 用于新的 Rails 支持的应用程序(使用 Active Model Serializers)。我正在努力理解这个框架,所以这可能是一个新手问题。

我的数据结构是这样的(简化):

Event Days --
    Events -- 
       * Participants
       * Location

在“活动日”内可能有数千个活动(在一个活动内有数十名参与者及其所有数据)。

似乎“错误”的是,当我想获取事件日列表时,我加载了一些 JSON,其中不仅包含 EventDays,还包含所有事件(然后是其中所有内容的所有数据)......基本上,它会加载整棵树!

我认为我可以通过对操作使用自定义序列化程序来解决这个问题,但是,在某些时候我需要获取数据,而 Ember 似乎再也不会调用服务器了。

因此,如果我加载 EventDays 并且其中没有事件数据,则当我单击“显示”方法时,Ember 永远不会调用服务器来更新 EventDay 对象。

我不知道我在这里是否清楚。我希望在这方面领先于我的人能够理解我在做什么!

真的,我认为它归结为2个问题:

1)如何正确过滤请求信息,以便只填写本地对象(即在调用索引方法时我需要一个没有孩子的事件日列表,但在调用显示方法时我需要一个活动日充满了下一个级别)

2) 如何让 Ember 在适当的时候“重新加载”一个对象以填写适当的内容

也许我看错了 - 错过了像 Ember 这样的东西 - 如果是这样,我欢迎指向适当教程的指针,但我找不到任何东西(即使在 Ember 网站上)解释除了加载整个文件之外如何做任何事情一下子树。使用 Gigs 数据,这似乎很慢,绝对是浏览器杀手,而且完全是错误的。

感谢 StackOverflow 兄弟帮助我学习!

编辑

由于某种原因我立即被否决了,我将添加代码:

客户端:

App.EventDay = DS.Model.extend({
  day: DS.attr('date'),
  events: DS.hasMany("Event", {async: true})
});

服务器端:

class EventDaySerializer < ActiveModel::Serializer
  attributes :id, :day
  has_many :events, embed: :ids, key: :events
end

编辑 2

在 kertap 的建议之后,我添加了 async 属性并更新了上面的序列化程序代码。

json在这里:

{"event_day":
    {"id":2,
    "day":"2013-12-05",
    "events":[1,2,3,4,5,6,7,8]
    }
}

值得注意的是,如果我不使用key: :events序列化程序中的参数,事情会返回为"event_ids": [1,2,3,4]which,您会认为是正确的,但会导致 Ember 看不到事件。

另外值得注意的是,如果我这样做:

HorseFeeder.ApplicationSerializer = DS.ActiveModelSerializer.extend({});

然后什么都不起作用!我明白了Error while loading route: Error: Assertion Failed: The response from a findAll must be an Array, not undefined

我真的不认为让 Ember 和 Rails 的基本接线工作起来这么难......

4

1 回答 1

0

您可以告诉 ember 数据关系是异步的。

App.EventDay = DS.Model.extend({
  day: DS.attr('date'),
  events: DS.hasMany("Event", {async: true})
});

如果您这样做并获得所有 EventDays,您将从服务器端获得 EventDays 列表。服务器端应使用事件日中包含的事件 ID 进行响应,或者您可以提供一个链接到所有事件的 url。在您需要事件之前,Ember 不会加载事件。

然后,当您为事件日调用 show 方法并在模板中获取当天的所有事件时,ember 数据将关闭并获取事件数据。

于 2013-12-09T16:23:59.250 回答