2017-08-28 2 views
0

Fabricを使用して共同描画アプリケーションを作成しています。このアプリの性質上、ある種の元に戻す/消去機能を実装するよりも、一度にすべての行を一度に削除する方が良いでしょう。私はpath Sのリストを反復処理しようとしたFabricJSで複数のパスを削除する

、そうのような:パスを削除する(議論hereとして)配列の長さを変更するため

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]); 
} 

最初のものは、動作しません。しかし、第2のものは永遠に走り、私はなぜその理由がわからない。

これが間違ったアプローチの場合は、教えてください。ありがとう!

+0

キャンバスからパスを削除しても、フィルタされたパス配列の長さは変更されません。 – Pointy

+0

@ Pointyまあ、それはbrainfartだった。私が家にいても動作することを確認しますが、そうだと思います。ありがとう! –

+0

私が知る限り、 'getObjects()'はライブラリが管理する内部配列への参照を返します。しかし、そのような '.filter()'を使うと、* new *配列になります。 – Pointy

答えて

0

1素晴らしく、簡潔な方法で行うことです。

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

このようにgetObjectsは、新しい配列を返しますし、あなたが作業している配列と怒っせずにそれらを削除することができるはずです。

私は、getObjects()は、そのような状況を簡単に処理できるように、常に浅いコピーを返すべきだと考えています。誰かが何らかのパフォーマンス上の問題を抱えている場合でも、canvas._objectsに直接アクセスできます。

+0

興味深い!したがって、getObjectsは引数を追加しないとインプレースで変更されますが、新しい配列を作成する場合は変更されます。 –

+0

はいソースを読み込んだ場合、getObectsは配列を直接、またはフィルターを適用したバージョンを返します – AndreaBogazzi

関連する問題