2016-04-08 9 views
4

Diese Frage gehört zu FabricJS und Canvas. In der folgenden Fallprüfung gibt es ein Objekt, dessen Eigenschaft wahr ist (obj.background == true). Es kann mehrere Bilder auf der Leinwand geben. Nach der ersten Objekterkennung möchte ich die Schleife beenden. Wie mache ich das? Ich habe return false; verwendet, funktioniert aber nicht. Hier ist die Funktion.Wie forEachObject loop zu beenden?

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

Sie können eine 'flag' darin haben .. Aber wenn Sie eine Schleife beenden möchten, gehen Sie mit dem' for-loop ... break; ' – Rayon

+0

Haben Sie versucht' continue n; '? – Phil795

+1

Wahrscheinlich ist 'forEachObject' nicht dazu gedacht, die Schleife zu beenden, bevor jedes Objekt gegen die' function (obj) 'ausgeführt wird. Sie sollten in Betracht ziehen, normale For-Schleife zu verwenden. – Ian

Antwort

4

Jetzt habe ich nicht verwendet FabricJS (Erwartung einer Spam von Down-Stimmen bereits) an der Quelle suchen eine ist getObjects() Methode. Dadurch wird ein Array von Objekten anstelle eines benutzerdefinierten Iterators wie zurückgegeben.

damit So könnte man die normalen Array itteration Methoden wie forEach(), some(), every() usw. benutzen, die Ihnen erlaubt, zu tun, was Sie wollen.

Also mein Verständnis willst du überprüfen, ob das Objekt ein Bild ist und ob seine Hintergrund-Eigenschaft wahr ist, und die Schleife beim ersten Auftreten abbrechen? Dies sollte es tun.

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

Offensichtlich ist dies Pseudocode. Im Wesentlichen wird es alle Objekte Schleife und Abbrechen, wenn Ihre Rückkehr true. Wenn irgendein Element true zurückgibt, wird der Rückgabewert von some auch true sein.


EDIT nach Michał Dopiralski Kommentar.

Ich habe die Tatsache übersehen getObjects kann einen Typ übergeben werden und wird die Ergebnisse für Sie filtern. So werden die Dinge noch einfacher.

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: Auf einer Seite zur Kenntnis der hasOwnProperty Check ist nicht notwendig werden sollte, ich glaube nicht. Solange obj definiert ist, gibt der Zugriff auf eine Eigenschaft, die nicht existiert, undefined zurück. Welches wird die === true Überprüfung fehlschlagen.

+1

Und whatsmore können Sie einen Objekttyp an getObjects() übergeben und erhalten ein Array von Objekten, die Sie benötigen. Zum Beispiel liefert canvas.getObjects ('image') ein Array von object.type === 'image' :-) –