Backbone.js вид модели, содержащей коллекцию? - PullRequest
1 голос
/ 14 декабря 2011

В моем приложении Backbone.js есть Модель, которая содержит Коллекцию.Для поддержки извлечения этой модели из серверной части я переопределяю метод parse для преобразования массива в ответе JSON в экземпляр коллекции.Это выглядит примерно так:

class SomeModel extends Backbone.Model
  defaults: ->
    collection: new SomeCollection([new SomeModel(attr: value)])

  parse: (res) ->
    res.collection = new SomeCollection(res.collection)
    res

class SomeCollection extends Backbone.Collection
  model: SomeOtherModel

class SomeCollectionView extends Backbone.View
  el: $('collection-view')

Мои проблемы заключаются в том, что хотя SomeCollectionView привязано к существующему экземпляру SomeCollection, при вызове SomeModel.fetch() этот экземпляр заменяется, и представление больше не действует,Я могу вызвать remove() в старом представлении и создать новый, но мой SomeCollectionView расположен поверх существующего HTML (не создан из шаблона), а вызов remove вытаскивает элемент из DOM,Более того, я бы предпочел, чтобы моя точка зрения просто реагировала на событие изменения, а не требовала реконструкции.

1 Ответ

2 голосов
/ 14 декабря 2011

Я сделал то, что вы сказали (коллекция в модели) с другой "стороны", которая бы работала здесь. Когда у меня была модель с коллекцией, я использовал события в модели для создания коллекции.

class ModelA extends Backbone.Model
  initialize: ->
    bind("change", @initializeCollection)

  initializeCollection: ->
    if !@collection
      @collection = new Collection(@attributes.collection) 
    else
      @collection.set(@attributes.collection)

Остальное тоже самое, поэтому я не буду его вставлять.

Также, если вы пойдете глубже: модель A -> коллекция B -> модель B -> коллекция C -> модель C Чем в modelB в конструкторе вы можете создать collectionC (при условии, что вы ее не используете)

[Изменить] У меня есть другая идея:

class ModelA extends Backbone.Model
  parse: (resp) ->
    if @attributes.collection
      @attributes.collection.set(resp.collection)
      delete resp.collection
    else
      resp.collection = new Collection(resp.collection)
    resp
...