【发布时间】:2015-05-20 22:58:49
【问题描述】:
我已经使用 Ember 工作了几个月了。我们的项目必须离线运行,所以我们使用了 App Cache 和 Ember Localstorage Adapter。我已经对这种方法感到非常满意。我们一次从服务器加载所有数据,然后在整个项目的路线中使用它。
目前我们必须为我们的项目构建管理面板。不需要离线工作。我想我可以试试 Ember 的 RESTAdapter,因为它似乎是最流行的数据处理方式。
在我的第一印象中,它使事情变得更加复杂。
例如(为了示例,我会过度简化),我有 2 个实体:
App.User = DS.Model.extend({
firstName: DS.attr('string'),
lastName: DS.attr('string'),
phoneNumber: DS.attr('string'),
studies: DS.hasMany('study')
});
App.Study = DS.Model.extend({
name: DS.attr('string'),
description: DS.attr('string'),
});
还有那套路
App.UsersRoute = Ember.Route.extend({
model: function(){
return this.store.find('user');
}
});
App.UserRoute = Ember.Route.extend({
setupController: function (controller, model) {
var userId = model.get('id');
this._super.apply(this, arguments);
this.store.find('user', userId).then(function (user) {
controller.set('user', user);
});
}
});
在/users 路线上,我只显示用户的基本信息。
在/user 路线上,我展示了他的信息和他被分配到的研究。
这意味着如果用户使用transitionTo 从/users 移动到/user 路由,user 模板将从内存数据存储中接收user 模型。尽管如此,还没有加载 studies 并且无法显示它们。最终,我们必须将studies 模型与users 一起加载一次。
如果直接从浏览器的 URL 访问 /user 路由或发生页面刷新,则服务器必须为 user 模型提供再次侧载的 studies。
所以在服务器端,我们必须实现两个控制器方法,它们必须返回类似的东西。
/users路由:
`{
"users":[{/*user1*/},{/*user2*/}],
"studies":[{/*study1*/}, {/*study2*/}, {/*study3*/}]
}`
/user路由-
{
"user":{/*userdata*/},
"studies":[/*and array of studies*/]
}
考虑到我们不使用大数据集。假设最多 20 个用户和最多 20 个研究,为什么我不应该一次加载它们并使用 localstorage 适配器存储它们(以保证数据免受页面刷新)并使用 RESTAdapter?
在我看来,通过使用 RESTAdapter, 我们必须在服务器端编写更多代码,最重要的是,用户体验会受到影响。大多数情况下,当请求往返于服务器并返回时,会有几秒钟的延迟。
请分享您的意见。如果没有大数据集,为什么要使用 RESTAdapter?为了强制使用 RESTAdapter,数据集应该有多大?与本地存储相比,还有其他优势吗?
【问题讨论】:
标签: ember.js ember-data