2014-08-27 38 views
1

我想知道是否可以按以下方式將模型添加到集合中。 我試過了,它不起作用。如果我直接添加JSON [],它會。我知道這有點奇怪,但我試圖更好地理解BB的工作原理。謝謝。Backbone.js將從服務器檢索到的模型添加到集合

var UserModel = Backbone.Model.extend({ 
    urlRoot: '/users', 
}); 

var UserModels = Backbone.Collection.extend({ 
    url: '/users', 
    model: UserModel 
}); 

var user = new UserModel({id:1}); 
user.fetch({ // get the model 
    success: function (user) { 
     var users = new UserModels(); 
     users.add(user); // add the model to a collection 
    } 
}); 

以下模型正在從服務器迴盪:

[{"name":"john","email":"[email protected]"}] 
+0

這應該可以正常工作。我看到的唯一問題是您要返回一個模型列表而不是單個模型。這似乎是錯誤的,因爲您正在獲取單個模型。 – 2014-08-27 20:20:01

+0

你在響應ajax調用時看到了什麼(在開發工具中)? – kinakuta 2014-08-27 22:34:46

+0

下面的答案適用。我認爲將一個元素添加到集合中是有問題的。需要剝去[]以使其正常工作。 – user1884367 2014-08-28 09:56:11

回答

3

由於來自服務器的響應是具有單個元件的陣列,則需要添加一個parse function返回所述第一元件陣列的:

var UserModel = Backbone.Model.extend({ 
    urlRoot: '/users', 
    parse: function(response){ 
     if(response && response.length) return response[0]; 
    } 
}); 

這應該允許模型在從服務器此響應正確解析的屬性:[{"name":"john","email":"[email protected]"}]

順便說一下,您正在創建成功函數中的用戶集合,所以它不會在該函數之外提供。它可能只是您發佈的示例代碼,但你可以之外創建的用戶收集和剛纔添加的模型成功函數:

var users = new UserModels(); 
var user = new UserModel({id:1}); 
user.fetch({ // get the model 
    success: function (user) { 
     users.add(user); // add the model to a collection 
    } 
}); 

我有created a fiddle所以你可以試試看。 (我使用小提琴回聲服務,所以這就是爲什麼我已經改變了網址,它使用的是POST)。如果您運行它並檢查控制檯,您將看到正在記錄的用戶集合,並且您可以檢查其models屬性。

+0

非常好。完美工作。謝謝! – user1884367 2014-08-28 09:51:37

+0

這似乎沒有PUT和POST請求的解析函數正常工作。只有GET用戶/ ID似乎需要它。有沒有解釋呢? – user1884367 2014-08-28 18:40:02

+0

小提琴使用POST。如果我刪除了解析函數,那麼集合將獲得一個模型,但該模型具有不正確的屬性(它以原始屬性ID和名稱和電子郵件名稱爲「0」的另一個屬性結束) – 2014-08-28 19:12:05

相關問題