2012-07-03 183 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

任何幫助,概述我在做什麼錯將大規模讚賞。

感謝

編輯

感謝您抽出時間到後反饋,這正是我所期待的。

如果您不去手動設置屬性,JSON是否物理定義了模型的實際屬性? 換句話說,如果我回來的JSON正如上面所建議的那樣,Backbone會簡單地創建一個Client對象(具有4個屬性ID,標題,姓氏&姓氏)以及2個預訂對象(每個對象具有4個屬性和據推測,BookingsCollection的每個成員)?

如果是這種情況,引用每個對象的屬性的格式是什麼?當我建立一個非骨幹關係的迷你應用程序時,我最終陷入了一種情況,我可以僅使用Client.Attribute或Booking [0] .EventDate來引用屬性,例如。我似乎無法使用上面列出的格式來執行此操作。

再次感謝。

回答

3

返回的JSON不是默認情況下骨幹或骨幹關係所期望的。

骨幹網和骨幹網,關係的期望是:

{ 
    "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功能。與我的例子JSON工作模型定義

一個的jsfiddle例如:http://jsfiddle.net/edwardmsmith/jVJHq/4/

其他說明

  • 骨幹預計ID字段默認情況下被命名爲 「ID」。要使用其他字段作爲ID一個模型,使用Model.idAttribute
  • 我改成「紅黃牌」

示例代碼「關鍵」的預訂集:

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(),0 defaultsvalidate()的組合來更好地控制哪些屬性有效且允許。

通過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

感謝愛德華我很欣賞你的輸入。我在回覆中編輯了我的答案(沒有設法找出正確的答案) –