Модели в более чем одной коллекции? - PullRequest
3 голосов
/ 07 ноября 2011

Я немного потерян, поэтому любая помощь будет высоко ценится. (Я использую Backbone.js и CoffeeScript.)

У меня есть группа моделей. Все они вставлены в MasterCollection.

MasterCollection extends Backbone.Collection
    model: Model

MasterCollection.add({#attributes of a new model})

Мне нужно время от времени отделять эти модели и обрабатывать их атрибуты партиями. Эти партии также должны иметь соответствующее представление DOM, которое может отображать все данные моделей.

Model extends Backbone.Model
    initialize: () ->
        #add the model to it's batch, batches are collections stored in an array
        batches = ParentModel.get('baches')

        #find the batch this model belongs in
        for batch in batches
            if batch = #the right one
                batch.add(@toJSON)

Batch extends Backbone.Collection
    changeAttributes: () ->
        for model in @models
            #change things about the model
  • Когда эта модель будет изменена партией, будет ли она обновлять модель в MasterCollection?
  • Когда я закончу с коллекцией пакетов, как мне избавиться от нее, не удаляя ее модели?
  • Должен ли я хранить эти коллекции пакетов в чем-то лучше, чем массив? Должны ли они быть моделями?

Поскольку мне нужно, чтобы DOM связывался с созданием новых партий, было бы здорово иметь их в качестве моделей в коллекции.

Является ли это хорошим способом для такого типа вещей в целом?

Спасибо!

1 Ответ

1 голос
/ 08 ноября 2011

Когда эта модель изменяется пакетом, она обновляет модель в MasterCollection?

Так как вы делаете

batch.add(@toJSON)

вы просто добавляете клон модели в коллекцию batch. Таким образом, при изменении атрибутов модели этой коллекции оригиналы не будут затронуты.

Конечно, это мелкие копии, так что если вы сделаете что-то вроде

(batch.at(0).get 'attr').x = y

Вы будете изменять атрибут attr оригинала. (Вы также не будете инициировать какие-либо события изменения.) Это вообще запрещено в Backbone. Вместо этого сделайте что-то вроде

attrCopy = _.extend {}, batch.at(0).get 'attr'
attrCopy.x = y
batch.at(0).set attr: attrCopy
...