假设我有一个带有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
那不能正确吗?!
请赐教 - 你通常如何为这些嵌套集合建模?
答案 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()
像这样修改你的结构可能会产生一个额外的模型,但它会让你的代码整体更清晰。