与ember.js概念斗争 - 大量数据

时间:2013-12-09 02:01:42

标签: ruby-on-rails ember.js ember-data active-model-serializers

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

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

Event Days --
    Events -- 
       * Participants
       * Location

在“活动日”内,可能会有成千上万的活动(以及活动内部数十名参与者及其所有数据)。

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

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

因此,如果我加载EventDays并且内部没有事件数据,当我点击“show”方法时,Ember从不会调用服务器来更新EventDay对象。

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

我觉得它归结为两个问题:

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

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

也许我正在看这个错误 - 错过了像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]的形式返回,您认为这是正确的,但会导致Ember看不到事件。< / p>

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

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的基本接线工作变得困难......

1 个答案:

答案 0 :(得分:0)

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

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

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

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