我和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
路线上,我会显示他的信息以及他被分配到的研究。
这表示如果用户使用/users
从/user
移至transitionTo
路线,则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,数据集应该有多大?本地存储还有其他优势吗?
答案 0 :(得分:3)
您可以随时push everything进入商店(使用push,pushMany或pushPayload),在这种情况下,您的金额不会很高数据,所以它不是什么大问题,但你仍然必须至少从服务器获取一个,这是你的真相来源。
但由于这是管理面板,我猜你不仅要显示数据,还要更新并可能删除,所以你必须仍然实现在服务器端处理它的方法,而REST是标准方法要做到这一点,但是ember不会强迫你使用它,如果你想要你可以做$.post
(不推荐)。
您也不需要侧载所有内容,您可以定义您的关系async
studies: DS.hasMany('study', {async:true} )
然后,对于与该用户相关的每项研究,ember首先会点击/user
然后/studies/{id}
。
有关详细信息,请参阅the guide。