【问题标题】:RESTAdapter vs Localstorage. Why should I switch to RESTAdapter?RESTAdapter 与本地存储。为什么要切换到 RESTAdapter?
【发布时间】: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


    【解决方案1】:

    你可以随时push everything你需要进入商店(使用pushpushManypushPayload),在这种情况下你没有大量的数据,所以没什么大不了的,但是您仍然必须从服务器中获取至少一个,这是您的真实来源。

    但是由于这是管理面板,我猜您不仅要显示数据,还要更新和可能删除,因此您仍然必须在服务器端实现处理该问题的方法,而 REST 是标准方法这样做,但 ember 不会强迫您使用它,如果您愿意,您可以随时使用 $.post(不推荐)。

    您也不需要侧载所有内容,您可以定义您的关系async

    studies: DS.hasMany('study', {async:true} )
    

    然后,对于与该用户相关的每个研究,ember 将首先点击/user,然后点击/studies/{id}

    请参阅the guide 了解更多信息。

    【讨论】:

    • 感谢您的回答。 {async: true} 将完成我担心的工作。
    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多