Recolha da coluna vertebral nas colecções

Estou a construir a minha primeira aplicação web a sério usando a coluna vertebral e estou a lutar com recursos aninhados.

Esta é uma versão simplificada da resposta json com a qual estou a trabalhar:

{
  "id": 1,
  "title": "Test Survey",
  "groups": [
    {
      "id": 1,
      "title": "Basic Questions",
      "questions": [
        {
          "id": 1,
          "title": "Which is your favorite color?"
        },
        {
          "id": 2,
          "title": "Do you have any other hobbies?"
        }
      ]
    },
    {
      "id": 2,
      "title": "Working Questions",
      "questions": [
        {
          "id": 3,
          "title": "Do you think working exp is very important?"
        }
      ]
    }
  ]
}
Basicamente, há um objeto de pesquisa que tem muitos grupos, cada grupo tem muitas perguntas.

Não consigo encontrar uma boa maneira de colocar todos estes dados em modelos / colecções.

o que tenho actualmente é:

// Models
var Question = Backbone.Model.extend({});
var Group    = Backbone.Model.extend({});
var Survey   = Backbone.Model.extend({ url: surveyURL });

// Collections
var GroupsCollection    = Backbone.Collection.extend({});
var QuestionsCollection = Backbone.Collection.extend({});

//Views
var SurveyView = Backbone.View.extend({
  ..
});

var GroupsCollectionView = Backbone.View.extend({
  ..
});

var QuestionsCollectionView = Backbone.View.extent({
  ..
});

var survey = new Survey({ groups: new GroupsCollection({model: Group}) });   
var groupsView  = new GroupsCollectionView({collection: survey.get('groups')});
Isto parece funcionar para grupos de nidificação no inquérito modelo, mas como eu armazenar as perguntas em uma coleção e, em seguida, atribuir isso a cada modelo na coleção de grupos?

Como mencionado, sou relativamente novo na coluna vertebral, por isso, se estiver a seguir o caminho errado ou houver uma maneira melhor de fazer isto, por favor, avisa-me.

Saúde.

Author: Chris Hanson, 2013-09-30

2 answers

Normalmente declaro as minhas sub-colecções como propriedades dos meus objectos (removo-as dos atributos hash : no seu exemplo, isso significa referenciá-las survey.groups em vez de survey.get('groups')) e uso model.parse para as povoar.

Com o seu modelo Survey:

var GroupsCollection = Backbone.Collection.extend({
    model: Group
});

var Survey = Backbone.Model.extend({
    initialize: function(data) {
        this.groups = new GroupsCollection();
        this.parse(data);
    },
    parse: function(data) {
        if (data.groups) {
            this.groups.reset(data.groups);
        }
        return _.omit(data, 'groups');
    }
});
A sua classe seria declarada de forma semelhante. Passarias os teus dados ao construtor.
var s = new Survey({
    "id": 1,
    "title": "Test Survey",
    "groups": [],
    ...
});

var g = s.groups.at(0); //first group
var q = g.questions.at(0); //first question in the first group

Os seus dados são então atravessados para construir toda a hierarquia.

E uma demo http://jsfiddle.net/nikoshr/947Vf/

 4
Author: nikoshr, 2013-09-30 13:52:37
A resposta acima foi um pouco pesada para o meu caso que me levou a esta pergunta. Isto pode ser útil para qualquer um que procure. Tinha criado quatro colecções. Deviam estar contidos numa colecção. Uma vista de colecção conteria mais quatro vistas de colecções, cujas vistas-filhos (vistas simples) renderiam os dados. Quando criei a colecção de embrulhos

new Backbone.Collection([collectionA, collectionB, collectionC, collectionD])

Devolveram-me uma colecção que continha quatro modelos. eram modelos de coluna vertebral . O que era bom até aqueles modelos não conterem as minhas colecções. Isto foi resolvido criando modelos de embrulho que conteriam uma das minhas quatro colecções.
var wrapperModelA = new Backbone.Model({ collection: collectionA });
...
var wrapperModelD = new Backbone.Model({ collection: collectionD }); 

return new Backbone.Collection([wrapperModelA, ... , wrapperModelD]);
Isto preservou as minhas colecções e permitiu-me criar uma estrutura aninhada sem definir novas classes.
 0
Author: louisdeb, 2017-08-01 14:59:39