заполнение вложенной коллекции вложенным json - PullRequest
3 голосов
/ 16 января 2012

Решение по моему маршруту

Myapp.Routes = Backbone.Router.extend({
   init: function(){
        user = new User();
        user.fetch({user,
                     success: function(response){
                             user.classlist = new classes(response.attributes.classes);
           });

   }

});

С моего сервера возвращается сериализованный массив json, и я пытаюсь поместить вложенные объекты в мои вложенные коллекции.

Этот ответ, я думал, собирался привести меня туда, но я что-то упустил. Как создать коллекцию / модель из вложенного JSON с Backbone.js

JSON, которым я пытаюсь заполнить мою вложенную модель:

{first_name: "Pete",age: 27, classes: [{class_name: "math", class_code: 42},{class_name: "french", class_code: 18}]}

Я создаю свою пользовательскую модель

MyApp.Models.Users = = Backbone.Model.extend({

    initialize: function(){
        this.classlist = new MyApp.Collections.ClassList();

        this.classlist.parent = this;

    }

});

Я пытался последовать примеру на другой странице и использовать

      this.classlist = new MyApp.Collections.ClassList(this.get('classes'));

        this.classlist.parent = this;

но this.get('classes') возвращает неопределенное значение.

Я также пытался получить массив classes через this.attributes.classes, но это также не определено.

------------ обновлено для включения повторной инициализации -------------------- Функция, в которой я инициализирую пользователя и классы, находится в маршрутах пользователя и называется повторной инициализацией. Я использую эту функцию, чтобы выбрать пользователя и его классы и сохранить объект.

re_initialize: function(id){
            user = new MyApp.Models.User();
            MyApp.editingClasses.url = 'classes/'+id;
            MyApp.editingClasses.fetch({
                        success: function(response){
                        MyApp.editingClasses.parse(response);
                        }
            });

        new MyApp.Views.ClassesInput();
    },

Как видите, я вызываю parse явно в функции успеха, но она не добавляет классы в коллекцию.

Я не могу включить «коллекцию», потому что по какой-то причине я не могу получить к ней доступ в магистрали. Пользовательская модель после возвращения в магистраль включает в себя массив классов, который я пытаюсь поместить в коллекцию ClassList.

Объект пользовательской модели, скопированный из терминала javascript, выглядит следующим образом.

attributes: Object
created_at: "2012-01-05T16:05:19Z"
id: 63
classes: Array[3]
   0: Object
   created_at: "2012-01-18T20:53:34Z"
   id: 295
   teacher_id: 63
   class_code: 42
   updated_at: "2012-01-18T20:53:34Z"
   class_name: math
   __proto__: Object
  1: Object
  2: Object
  length: 3
  __proto__: Array[0]

Ответы [ 2 ]

9 голосов
/ 17 января 2012

Вы можете использовать функцию parse для предварительной обработки ответа сервера:

MyApp.Models.Users = Backbone.Model.extend({
  parse: function(response) {
    var classesJSON = response.classes;
    var classesCollection = MyApp.Collections.ClassList(classesJSON);
    response.classes = classesCollection;
    return response;
  }
});

var user = new MyApp.Models.Users();
user.fetch();

// You should now be able to get the classlist with:
user.get('classes');

При этом подход, предложенный в другом вопросе, также должен работать.Возможно, когда вызывается ваша функция initialize, модель еще не заполнена данными?

Например, если вы делаете:

var user = new MyApp.Models.Users();

Этоне будет иметь никаких атрибутов для передачи в коллекцию классов.Может ли это быть вашей проблемой?

4 голосов
/ 19 января 2012

Хорошо! Вы можете получить классы таким образом:

Модель:

window.person = Backbone.Model.extend({
 defaults: { }
});

Коллекция:

window.ClassesCollection = Backbone.Collection.extend({
 model: person,  
 url: "http://your/url/data.json",
 parse: function(response){
   return response.classes;
 }
});

Маршрутизатор:

window.AppRouter = Backbone.Router.extend({
 routes: {
  ""  : "init"
 },

 init: function(){      
   this.classesColl = new ClassesCollection();
   this.classesColl.fetch();
   this.classesView = new ClassesView({collection: this.classesColl});     
 }
 });

Просмотр: (для рендеринга каждого класса)

window.ClassesView = Backbone.View.extend({
  el: $('...'),
  template: _.template($("...").html()),

  initialize: function() {
    this.collection.bind("reset", this.render, this);
  },
  render: function(collection) {

    _.each( collection.models, function(obj){ 
      ...
      //obj.get('class_name') or obj.get('class_code')
      ... 
    }, this );
       ...
    return this;
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...