2012-07-03 2 views
3

Я пытаюсь создать вложенный реляционный базовый проект, но я действительно борется. Грубое представление о том, что я пытаюсь сделать, показано ниже, но у меня создалось впечатление, что при вызове fetch() на клиенте автоматически будет создан ряд заказов на основе заказов, возвращаемых как JSON.Магистральные реляционные модели не создаются

Формат моего JSON можно увидеть под очертаниями MVC:

/**************************************************** 
/* CLIENT MODEL - Logically the top of the tree 
/* has a BookingsCollection containing numerous Booking(s)                    
/* Client 
/*  -Bookings    [BookingsCollection] 
/*   -Booking   [Booking] 
/*   -Booking   [Booking] 
/*****************************************************/ 
var Client = Backbone.RelationalModel.extend({ 

    urlRoot: '/URL-THAT-RETURNS-JSON/', 

    relations: [ 
     { 
      type: Backbone.HasMany, 
      key: 'Booking', 
      relatedModel: 'Booking', 
      collectionType: 'BookingsCollection' 
     } 
    ], 

    parse: function (response) { 

    }, 

    initialize: function (options) { 
     console.log(this, 'Initialized'); 
    } 

}); 


var Booking = Backbone.RelationalModel.extend({ 

    initialize: function (options) { 
     console.log(this, 'Initialized'); 
    } 

}); 

var BookingsCollection = Backbone.Collection.extend({ 

    model: Booking 

}); 

Approximate JSON being returned

Любая помощь с изложением того, что я делаю неправильно было бы массово оценили.

Благодаря

EDIT

Спасибо, что нашли время, чтобы отправить обратную связь, это именно то, что я надеялся.

Это тот случай, когда JSON физически определяет фактические атрибуты моделей, если вы не пытаетесь настроить атрибуты вручную? Другими словами, если JSON я вернусь, как вы предложили выше, будет ли Backbone просто создавать объект Client (с 4 атрибутами id, title, firstname & surname), а также 2 объекта для бронирования (каждый из которых имеет 4 атрибута и предположительно, каждый член BookingsCollection)?

Если это так, каков формат ссылки на атрибуты каждого объекта? Когда я создал немагистральную-реляционную мини-приложение, я оказался в такой ситуации, когда я мог бы просто ссылаться на атрибуты с помощью Client.Attribute или бронирования [0] .EventDate, например. Кажется, я не могу это сделать в формате, который вы указали выше.

Еще раз спасибо.

ответ

3

Возвращаемый JSON не является базовым или базовым-реляционным по умолчанию.

Ожидание Backbone и Backbone-Relational является:

{ 
    "id": "123456", 
    "Title":"Mr", 
    "FirstName":"Joe", 
    "Surname":"Bloggs", 
    "Bookings": [ 
     { 
      "id": "585462542", 
      "EventName": "Bla", 
      "Location":"Dee Bla", 
      "EventDate":"November 1, 2012" 
     }, 
     { 
      "id": "585462543", 
      "EventName": "Bla", 
      "Location":"Dee Bla", 
      "EventDate":"November 1, 2012" 
     } 
    ] 
} 

Чтобы использовать ваш ответ, вы должны создать parse функцию на модели клиента, которая возвращает структуру, я отвечал выше.

jsFiddle пример ваших определений моделей, работающих с моим примером JSON: http://jsfiddle.net/edwardmsmith/jVJHq/4/

Других ноты

  • Backbone ожидает ID поля будет называться "идентификатор" по умолчанию.Чтобы использовать другое поле в качестве ID для модели, используйте Model.idAttribute
  • "ключ" для Bookings коллекции я изменил "Бронирование"

Пример код:

Client = Backbone.RelationalModel.extend({ 

    urlRoot: '/URL-THAT-RETURNS-JSON/', 

    relations: [ 
     { 
      type: Backbone.HasMany, 
      key: 'Bookings', 
      relatedModel: 'Booking', 
      collectionType: 'BookingsCollection' 
     } 
    ], 

    parse: function (response) { 

    }, 

    initialize: function (options) { 
     console.log(this, 'Initialized'); 
    } 

}); 


Booking = Backbone.RelationalModel.extend({ 

    initialize: function (options) { 
    console.log(this, 'Initialized'); 
    } 

}); 

BookingsCollection = Backbone.Collection.extend({ 

    model: Booking 

}); 

myClient = new Client( { 
     "id": "123456", 
     "Title":"Mr", 
     "FirstName":"Joe", 
     "Surname":"Bloggs", 
     "Bookings": [ 
      { 
       "id": "585462542", 
       "EventName": "Bla", 
       "Location":"Dee Bla", 
       "EventDate":"November 1, 2012" 
      }, 
      { 
       "id": "585462543", 
       "EventName": "Bla", 
       "Location":"Dee Bla", 
       "EventDate":"November 1, 2012" 
      } 
     ] 
    }); 


console.log(myClient);​ 

сообщение Редактировать

Да, JSON в значительной степени определяет атрибуты модели. Вы можете использовать комбинацию parse(), defaults и validate(), чтобы лучше контролировать, какие атрибуты действительны и разрешены.

Канонический способ считывания и настройки свойств на базовой модели осуществляется через функции get(), escape() и set().

set особенно важен, так как это делает кучу домашнего хозяйства, например, проверку атрибута и значения по вашей функции validate (если есть) и запуск событий изменения для модели, которую будут просматривать ваши просмотры.

В конкретном случае ситуации в этом ответе, вы можете

myClient.get('Title'); // => "Mr" 
myClient.get('Bookings'); //=> an instance of a BookingsCollection with 2 models. 
myClient.get('Bookings').first().get('Location'); //=> "Dee Bla" 
myClient.get('Bookings').last().get('Location'); //=> "Dee Bla" 
myClient.get('Bookings').first().set({location:"Bora Bora"}); 
myClient.get('Bookings').first().get('Location'); //=> "Bora Bora" 
myClient.get('Bookings').last().get('Location'); //=> "Dee Bla" 
+0

Благодаря Эдвард я ценю ваш вклад. Я отредактировал свой ответ выше с ответом (не удалось найти правильный способ ответа) –

Смежные вопросы