Backbone.js:对belongs_to关系建模

时间:2011-11-22 14:34:12

标签: model backbone.js

假设我有一个带有Posts集合的Backbone应用程序。所有帖子都属于博客。创建新帖子需要我知道它所属的博客:POST /blog/42/posts

这是我到目前为止所提出的 - 请告诉我是否有更好的解决方案:

知道Backbone不希望我对模型之间的关系进行建模,我只需将url属性转换为包含博客ID的函数:

class App.Collections.PostsCollection extends Backbone.Collection
  model: App.Models.Post
  url: -> "/blog/" + this.blogId + "/posts"

(请原谅CoffeeScript。)现在我需要让帖子集合知道blogId。所以我只是在路由器初始化函数中添加它:

class App.Routers.PostsRouter extends Backbone.Router
  initialize: (options) ->
    this.posts = new App.Collections.PostsCollection()
    this.posts.blogId = 42  # <----- in reality some meaningful expression ;-)
    this.posts.reset options.positions

那不能正确吗?!

请赐教 - 你通常如何为这些嵌套集合建模?

1 个答案:

答案 0 :(得分:0)

这是解决此问题的一种方法。另一种方法是创建一个Blog模型。假设您为Blog模型提供了posts()方法。在这种情况下,您可以使用类似的方法附加blogId,但在博客模型中。例如(也在Coffeescript中,如上所述):

class App.Models.Blog extends Backbone.Model
  posts: () =>
    @_posts ?= new App.Collections.PostsCollection({blog: this})

然后在你的PostsCollection中你会:

class App.Collections.PostsCollections extends Backbone.Collection
  url: () => "/blog/#{@options.blog.id}/posts"

允许您将路由器更改为:

class App.Routers.PostsRouter extends Backbone.Router
  initialize: (options) ->
    # Per your example, an ID of 42 is used below.
    # Ideally, you retrieve the Blog some other way.
    @blog = new App.Models.Blog({id: 42})
    @posts = @blog.posts()

像这样修改你的结构可能会产生一个额外的模型,但它会让你的代码整体更清晰。