2012-08-28 34 views
3

我有一個谷歌地圖對象的位置集合,存儲在骨幹集合:結合骨幹收集/ JavaScript和新車型的對象從服務器

var Location = Backbone.Model.extend({ 
    defaults: { 
     latitute: "", 
     longitude: "", 
     visited: false; 
    }, 
}); 

var LocationCollection = Backbone.Collection.extend({ 
    model: Location, 
    url: 'api/locations' 
}); 

隨着每個點點擊地圖上的位置模型屬性'visited'設置爲true。

原始位置集合來自數據庫(基於地圖邊界),該數據庫不存儲任何「訪問」信息,只是範圍內的位置列表。

當用戶通過移動,放大/縮小等來改變Google地圖的界限時,我需要在新參數中檢索一個全新的位置列表,然後以某種方式將該列表與現有集合進行同步,添加新的位置,但保留已訪問的屬性?

我希望這不是太模糊,但從哪裏開始?有沒有辦法使用jQuery將複雜對象從一個集合映射到另一個集合?或者更有意義的是分割集合,將訪問過的信息發送回服務器並將它們合併在一起?或者Backbone集合會記住「已訪問」的值,並僅使用新屬性更新集合中的值?

對不起,我以爲我知道這件事,但我從未做過這樣的事情。

+0

「我以爲我知道這個東西。」每天都是我。 ;-)這聽起來像你所需要的只是你的位置的一個集合,並簡單地將新的位置模型數據添加到它,而不會與舊的混淆。 Underscore提供了很多優秀的工具來映射覆雜對象,集合等,但在你的情況下,我認爲你不需要做任何這樣的事情,而且你不需要讓你的服務器做任何不必要的複雜事情。我在下面的答案中提供了具體的觀點。 – jmk2142

回答

2

這是可能的。基本上,我假設以下。用戶有一堆地點。他們點擊的位置屬性更改爲visited = true;

當他們縮小,你fetch()新車型,現在在視野中,但你也想不想要那些老位置復位到visited = false;服務器將基本計算的尺寸查看並提供一堆位置模型。

如果這是您想要的,您只需撥打電話fetch()即可:add:true

collection.fetch({ 
    add: true 
}); 

當您通過add:true選項將fetch()電話,也不會重新集合(從而掃除您的訪問數據)。相反,它只會添加集合中尚不存在的模型。所以如果你已經有locations.id = 1,2,3,你的服務器返回locations.id = 1,2,3,4,5,6 ......只有4,5,6將被添加到你已有的集合中。 1,2,3的visited = true(或false)數據應保持不變。

+0

太棒了!這要麼非常簡單,要麼非常困難!謝謝。 – user888734

+0

+1,注意:我認爲在Backbone 1.0中,您還需要合併:false – Crisfole