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

时间:2013-07-11 17:15:36

标签: 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个项目的集合。由于BackboneJS没有提供Save for Collections,我自己写了。我并不关心为我的Collection创建一个Model包装器。

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

所以,我想也许我需要覆盖Collection的parse方法并手动将服务器的响应映射回Collection。

这一切似乎......过度/错误。我在建筑上做错了吗? RESTful架构如何处理这种情况?

1 个答案:

答案 0 :(得分:2)

我的意见是做有效的工作,感觉足够干净,无视RESTafarians的信任。批量创建,批量更新,批量删除是REST用户只是闭上眼睛并假装不存在的真实世界用例。沿着这些方向的东西听起来像是对我的合理的第一次尝试:

  • 如果您有信心
  • ,请仔细创建bulkAdd方法或覆盖add
  • 虽然
  • ,但不要制作模型或将它们添加到集合中
  • 执行批量POST或其他任何操作,以获取分配的ID
  • 然后将它们作为模型添加到集合