2012-09-18 87 views
2

我習慣了Spine.js,但我想嘗試一下Backbone.js。Backbone.js - 集合之間的「同步」模型

在脊椎中,沒有收藏。只有模型。在Spine中,當我在不同的地方使用模型時,Spine會在更新模型時始終保持模型同步。在Backbone中,我發現情況並非如此。我希望你能告訴我我做錯了什麼!

我想創建具有在他們裏面3個模型2個收藏:

var Article = Backbone.Model.extend({}); 

var Articles = Backbone.Collection.extend({ 
    model: Article, 
    localStorage: new Backbone.LocalStorage("Articles") 
}); 

var articles1 = new Articles(); 
var articles2 = new Articles(); 

articles1.create({ id: 1, name: "Article 1" }); 
articles1.create({ id: 2, name: "Article 2" }); 
articles1.create({ id: 3, name: "Article 3" }); 

在Chrome中我使用控制檯和實驗一點點:

articles1.size() 
=> 3 
articles2.size() 
=> 0 
articles2.fetch() 
=> undefined 
articles2.size() 
=> 3 

到目前爲止好。在兩個集合的第一篇文章是「第1條」:

a1 = articles1.first() 
=> child 
a2 = articles2.first() 
=> child 
a1.get("name") 
=> "Article 1" 
a2.get("name") 
=> "Article 1" 

但是,當我嘗試更新的第一個集合中的模型,它不與第二收集同步:

a1.set({ name: "Article 1 - Updated" }) 
=> child 
a1.save() 
=> undefined 
a1.get("name") 
=> "Article 1 - Updated" 
a2.get("name") 
=> "Article 1" 

我的預期第二個集合中的模型自動更新自身。

但我可以看到這兩個文章型號有不同的CID:

a1.cid 
=> "c0" 
a2.cid 
=> "c3" 

所以我的問題是...你怎麼在骨幹呢?你如何保持模型在集合之間同步?

我其實讀過這篇博客文章:http://destroytoday.com/blog/reasons-for-spinejs/。他寫道:

動態記錄

這一個很瘋狂的魔法,但它解決了我與Backbone.js的面對 問題。假設您在 應用的一個視圖中獲取了一條記錄。然後,您以不同的視圖獲取並更新相同的記錄。 在Spine.js中,兩條記錄都會更新。你不必擔心 保持同步。當我讀到這個消息時,一滴眼淚就從我的臉頰滑落下來。

我真的試過尋找這個,但沒有運氣。

我希望你能指出我正確的方向如何做到這一點骨幹的方式!

回答

3

你有2點基本的選擇:

  1. 確保兩個集合包含對車型完全相同的實例的引用。不只是具有相同ID的兩個對象,而且實際上是該記錄的內存單一模型實例。

  2. 使用事件綁定嘗試保持集合或集合中的模型同步(在collection1上添加/刪除/更改/重置會導致collection2上的添加/刪除/更改/重置)。

如果你想脊椎行爲,讓#1工作。也許使用實例緩存as described here

+0

感謝您的回答!我希望它能夠融入Backbone。 :-( – agronemann

+0

我建議不要採用第二種方法,根據我的經驗,這會導致意大利麪條和不一致。 – mor