Backbone.js: моделирование отношения own_to - PullRequest
2 голосов
/ 22 ноября 2011

Скажем, у меня есть приложение Backbone с коллекцией сообщений. Все сообщения принадлежат блогу. Создание нового сообщения требует, чтобы я знал блог, которому он принадлежит: POST /blog/42/posts

Вот то, что я до сих пор придумал - скажите, пожалуйста, есть ли лучшее решение:

Зная, что Backbone не ожидает от меня моделирования отношений между моими моделями, я просто превратил атрибут url в функцию, включающую идентификатор блога:

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 голосов
/ 02 июня 2012

Это один из способов решения этой проблемы.Альтернативой является создание модели блога.Скажем, вы даете модели блога метод 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()

Такое изменение вашей структуры может привести к созданию дополнительной модели, но в целом ваш код станет намного чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...