我正在考虑将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的基本接线工作变得困难......
答案 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数据将关闭并获取事件数据。