2016-04-08 14 views
4

この質問はfabricJSとキャンバスに属します。次のケースチェックでは、true(obj.background == true)のプロパティのオブジェクトがあります。キャンバスには複数の画像があります。最初のオブジェクト検出の後、私はループを終了したい。私はこれをどうやって?私はreturn false;を使用しましたが動作しません。ここに関数があります。forEachObjectループを終了する方法は?

canvas.forEachObject(function(obj){ 
     if(obj.isType('image') && obj.hasOwnProperty('background')){ 
      if(!obj.background == true){ 
       alert("true"); 
       return false; 
      } 
     } 
    }); 
+1

あなたはループ内で 'flag'を使うことができます。しかし、ループを終了させたい場合は' for-loop ... break; 'に行きます。 – Rayon

+0

' continue n; 'を試しましたか? – Phil795

+1

おそらく 'forEachObject'は各オブジェクトが' function(obj) 'に対して実行される前にループを終了するようには設計されていません。通常のfor-loopの使用を検討することをお勧めします。 – Ian

答えて

4

今私はgetObjects()方法があるソースを見てFabricJS(すでにダウン票のスパムを待っている)を使用していません。これは、forEachObject()のようなカスタムイテレータの代わりにオブジェクトの配列を返します。

したがって、forEach()some()every()などのような通常の配列のすべての反復メソッドを使用することができます。これは、あなたが望むことを可能にします。

私は、オブジェクトがイメージで、その背景のプロパティが真であるかどうかをチェックし、最初のオカレンスでループを中断したいのですか?これはそれを行う必要があります。

canvas 
    .getObjects() 
    .some(obj => { 
     if (obj.isType('image') && obj.hasOwnProperty('background') && obj.background === true) { 
      console.log('Aww shucks, you found me.'); 
      return true; 
     } 
    }); 

これは明らかに疑似コードです。 本質的にすべてのオブジェクトをループし、戻り値がtrueの場合は中断します。返される要素がtrueの場合、someの戻り値はtrueになります。


Michal Dopieralskiコメント後のEDIT。

私は実際にはgetObjectsを渡すことができ、結果をフィルタリングします。そのことを使うことはさらに簡単になります。

canvas 
    .getObjects('image') 
    .some(obj => { 
     if (obj.background === true) { 
      console.log('Aww shucks, you found me.'); 
      return true; 
     } 
    }); 

array some docs

fabricjs getObjects source


EDIT: 側hasOwnPropertyチェックは私は思いません要求されるべきではない注意してください。 objが定義されていれば、存在しないプロパティにアクセスするとundefinedが返されます。チェックは、=== trueで失敗します。

+1

そして、あなたはオブジェクト型をgetObjects()に渡して、必要なオブジェクトの配列を得ることができます。たとえば、canvas.getObjects( 'image')はobject.type === 'image'の配列を返します:-) –

関連する問題