javascript - 如果我需要保存 Backbone.Collection,这是代码味道吗?

标签 javascript rest backbone.js

在使用 BackboneJS 时,我一直在尝试了解最佳的 RESTful 实践。我觉得我已经把自己陷入了困境,需要一些指导。

我的场景是这样的:用户想要创建一个包含 N 个项目的新播放列表。 N 个项目的数据来自第三方 API,批量为 50 个项目。因此,我想添加一个新的空播放列表,当 50 个播放列表突然出现时,保存项目并添加到我的播放列表中。

这导致我的播放列表模型具有一个方法 addItems,如下所示:

addItems: function (videos, callback) {
    var itemsToSave = new PlaylistItems();
    var self = this;

    //  Create a new PlaylistItem with each Video.
    videos.each(function (video) {

        var playlistItem = new PlaylistItem({
            playlistId: self.get('id'),
            video: video
        });

        itemsToSave.push(playlistItem);
    });

    itemsToSave.save({}, {
        success: function () {

            //  OOF TERRIBLE.
            self.fetch({
                success: function () {
                    //  TODO: For some reason when I call self.trigger then allPlaylists triggers fine, but if I go through fetch it doesnt trigger?
                    self.trigger('reset', self);

                    if (callback) {
                        callback();
                    }

                }
            });

        },
        error: function (error) {
            console.error("There was an issue saving" + self.get('title'), error);
        }
    });
}

ItemsToSave 通常是一个包含 50 个项目的 Collection。由于 BackboneJS 不提供 Save for Collections,所以我自己编写了一个。我不太关心为我的集合创建模型包装器。

因此,当我调用 Save 时,我的所有项目都没有 ID。数据库分配 ID,但 Backbone 不会隐式更新该信息,因为我保存的是集合而不是模型。因此,一旦保存成功,我就会在播放列表上调用 fetch 来检索更新的信息。这很糟糕,因为播放列表中可能包含数千个项目 - 我不想每次保存多个项目时都获取数千个项目。

所以,我想也许我需要重写 Collection 的解析方法并手动将服务器的响应映射回 Collection。

这一切似乎...矫枉过正/错误。我在做一些架构上不正确的事情吗? RESTful 架构如何处理这样的场景?

最佳答案

我的观点是,做有效的、感觉足够干净的事情,而忽略 RESTafarians 的可信度。批量创建、批量更新、批量删除是现实世界的用例,REST 人员只是闭上眼睛,假装不存在。对我来说,这些线索听起来像是一个合理的第一次尝试:

  • 创建一个 bulkAdd 方法,或者如果您有信心,请仔细重写 add
  • 暂时不要制作模型或将它们添加到收藏中
  • 执行批量 POST 或其他操作,将它们放入数据库并取回分配的 ID
  • 然后将它们作为模型添加到集合中

关于javascript - 如果我需要保存 Backbone.Collection,这是代码味道吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17599542/

相关文章:

java - 如何将 REST channel 添加到 Spring Webflow 应用程序?

javascript - Azure 网站 - 使用 REST 查询 Azure 数据库

javascript - ReactJs 防止输入类型数字中的 e 和点

javascript - JS 图表未显示在 iframe 中

javascript - 对 JavaScript 中的递归和执行流程有更清晰的解释吗?

django - 具有复杂查询的 REST API

javascript - 带 Backbone 的下划线模板中的嵌套循环

javascript - 如何让画线在 Internet Explorer 中工作?

java - 如何在curl中调用具有两个请求正文参数的endPoint

javascript - 将 Collection View 绑定(bind)到另一个 View