создание вложенной структуры с backbone-relational

#backbone.js #backbone-relational

#backbone.js #магистрально-реляционная

Вопрос:

Я пытаюсь создать три каскадных выпадающих списка. Первый содержит проекты, второй содержит задачи для выбранного проекта, а последний — сайты для выбранной задачи.

Я хочу использовать плагин Backbone-Relational, но мне трудно создать правильные отношения. Я впервые использую этот плагин.

Код до сих пор:

 App.Models.ProjectItem = Backbone.RelationalModel.extend({
    default: {
        id: 0,
        name: ''
    },
    relations: [{
        type: Backbone.HasMany,
        key: 'tasks',
        relatedModel: App.Models.TaskItem,
        //includeInJSON: Backbone.Model.prototype.idAttribute,
        collectionType: App.Collections.TasksCollection,
        reverseRelation: {
            key: 'projectId',
            //includeInJSON: Backbone.Model.prototype.idAttribute,
            type: Backbone.HasOne
        }
    }]
});

App.Collections.ProjectsCollection = Backbone.Collection.extend({
    model: App.Models.ProjectItem
});

App.Models.TaskItem = Backbone.RelationalModel.extend({
    default: {
        id: 0,
        name: ''
    },
    relations: [{
        type: Backbone.HasMany,
        key: 'sites',
        relatedModel: App.Models.SiteItem,
        includeInJSON: Backbone.Model.prototype.idAttribute,
        collectionType: App.Collections.SitesCollection,
        reverseRelation: {
            key: 'taskId',
            //includeInJSON: Backbone.Model.prototype.idAttribute,
            type: Backbone.HasOne
        }
    }]
});

App.Collections.TasksCollection = Backbone.Collection.extend({
    model: App.Models.TaskItem
});

App.Models.SiteItem = Backbone.RelationalModel.extend({
    default: {
        id: 0,
        name: ''
    }
});

App.Collections.SitesCollection = Backbone.Collection.extend({
    model: App.Models.SiteItem
});
  

Создание одного проекта:

 var item = new App.Models.ProjectItem({
  id: 1,
  name: 'project',
  tasks: [
    {
      id: 1,
      name: 'task',
      sites: [
        {
          id: 1,
          name: 'site'
        }
      ]
    }
  ]
})
  

Этот объект, сериализованный в json, выглядит следующим образом:

 "{"id":1,"name":"task","tasks":[1],"sites":[{"id":1,"name":"site"}],"projectId":null}"
  

Мои вопросы:

1) Почему массив сайтов не вложен в массив задач?

2) Коллекция сайтов не сериализуется так же, как tasks one . Должен ли я также создавать отношения в модели сайта?

3) Почему ProjectID возвращается для корня?

Ответ №1:

После многих часов проб и ошибок я, наконец, понял. Порядок имеет значение.. Рабочий код:

 App.Models.SiteItem = Backbone.RelationalModel.extend({
    default: {
        siteId: 0,
        name: ''
    }
});

App.Collections.SitesCollection = Backbone.Collection.extend({
    model: App.Models.SiteItem
});

App.Models.TaskItem = Backbone.RelationalModel.extend({
    default: {
        taskId: 0,
        name: ''
    },
    relations: [{
        type: Backbone.HasMany,
        key: 'sites',
        relatedModel: App.Models.SiteItem,
        //includeInJSON: Backbone.Model.prototype.idAttribute,
        collectionType: App.Collections.SitesCollection,
        reverseRelation: {
            key: 'task',
            includeInJSON: 'taskId',
            type: Backbone.HasOne
        }
    }]
});

App.Collections.TasksCollection = Backbone.Collection.extend({
    model: App.Models.TaskItem
});

App.Models.ProjectItem = Backbone.RelationalModel.extend({
    default: {
        projectId: 0,
        name: ''
    },
    relations: [{
        type: Backbone.HasMany,
        key: 'tasks',
        relatedModel: App.Models.TaskItem,
        //  includeInJSON: 'taskId',
        collectionType: App.Collections.TasksCollection,
        reverseRelation: {
            key: 'project',
            includeInJSON: 'projectId',
            type: Backbone.HasOne
        }
    }]
});

App.Collections.ProjectsCollection = Backbone.Collection.extend({
    model: App.Models.ProjectItem
});
  

Для примера данных:

 var item = new App.Models.ProjectItem({
  projectId: 2,
  name: 'first',
  tasks: [
    {
      taskId: 1,
      name: 'task',
      sites:[{siteId:1, name: 'site'}]
    }
  ]
});
  

Я получил эту строку json:

 "{"projectId":2,"name":"first","tasks":[{"taskId":1,"name":"task","sites":[{"siteId":1,"name":"site","task":1}],"project":2}]}"