2013-07-11 56 views
2

我一直在试图在使用BackboneJS时围绕最佳REST风格的做法。我觉得自己已经写下了自己的一点,可以使用一些指导。如果我需要保存Backbone.Collection,它是否是代码味道?

我的场景是这样的:用户想要创建一个新的播放列表,其中包含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包装器。

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

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

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

回答

2

我的意见是做什么有效,感觉干净,无视RESTafarians的信用可能。批量创建,批量更新,批量删除是REST人员闭眼并假装不存在的真实世界用例。这些方针的东西听起来像一个合理的第一次尝试对我说:

  • 创建bulkAdd方法或仔细覆盖add如果你感觉自信
  • 不作模型或他们尚未添加到集合中,虽然
  • 做你的批量POST或任何让他们进入数据库并得到指定的ID
  • 然后将它们作为模型添加到集合
相关问题