2017-08-28 95 views
0

我正在使用Fabric創建協作繪圖應用程序。由於此應用程序的性質,人們最好一次性刪除所有行,而不是執行某種撤消/擦除功能。刪除FabricJS中的多個路徑

我試圖遍歷的path S中的列表中,像這樣:

canvas.getObjects().forEach((path) => { 
    if(path.senderId === client.id){ 
    canvas.remove(path); 
    } 
}); 

// Or 

let paths = canvas.getObjects().filter(path => path.senderId === client.id); 

while(paths.length) { 
    canvas.remove(paths[0]); 
} 

第一個不工作的,因爲除去路徑修改數組的長度(如所討論的here)。然而,第二個永遠運行,我不知道爲什麼。

如果這是錯誤的方法,請讓我知道。謝謝!

+0

從畫布中移除路徑不會改變已過濾路徑數組的長度。 – Pointy

+0

@好點,那是一個腦筋急轉彎。當我回家時,我會確保它有效,但我敢打賭,情況就是這樣。謝謝! –

+0

據我所知,'getObjects()'返回由庫管理的內部數組的引用。但是當你使用'.filter()'時,你最終會得到一個* new *數組。 – Pointy

回答

0

一個很好的和簡潔的方式就是做:

canvas.getObjects('path').forEach((path) => { 
    if(path.senderId === client.id){ 
    canvas.remove(path); 
    } 
}); 

這樣getObjects會返回一個新的數組,你應該能夠在不惹毛了與你的工作在其陣列將其刪除。

我相信getObjects()應該總是返回一個淺拷貝,以便於處理這些情況。如果有人有一些性能問題,仍然可以直接訪問canvas._objects。

+0

有趣!所以如果你不添加一個參數,'getObjects'會就地修改,但如果你這樣做會創建一個新的數組? –

+0

是的,如果你讀了源代碼,getObects直接返回數組或者它的過濾版本 – AndreaBogazzi