2014-06-27 13 views
7

Der Titel sagt alles. Wenn ein Teil eines fabric.Group ist, reagiert es nicht mehr wie ein bearbeitbarer Text.Fabric.js - Grouped iText nicht editierbar

ist hier eine Use-Case: http://jsfiddle.net/vAjYd/

Gibt es eine Möglichkeit, dieses Problem zu lösen? Ansonsten muss ich meine on group schreiben.

Btw: A fabric.Group hat viele Vorteile, aber die deaktivierte Eventing macht es unmöglich, für UI-Elemente zu verwenden (d. H. Diesen Anwendungsfall oder Gruppen von Schaltflächen als Gruppen von Texten und Rezepten).

+1

Könnten Sie bitte Ihre Lösung für dieses Problem teilen? Ich stehe im Moment vor dem gleichen Problem, kann aber keine Lösung finden. Ich bin so weit gekommen: http://pastebin.com/dQ742AvG](http://pastebin.com/dQ742AvG), kann aber nicht herausfinden, wie ich die Bearbeitung für IText http://fabricjs.com/docs aktivieren kann /fabric.IText.html funktioniert nicht .. – JoeriSmits

Antwort

0

Momentan gibt es keine Möglichkeit für IText, die Ereignisse zu behandeln, da sie nicht weitergegeben werden, wenn sie in einer Gruppe enthalten sind. Ich denke, das ist auch der bevorzugte Weg, um damit umzugehen, da es den Benutzer verwirren würde - was ist, wenn er beginnt, mehrere Texte zu bearbeiten. Dies könnte zu einem Durcheinander führen. Vielleicht kannst du dein Skript ein wenig umarbeiten, um diese Probleme zu umgehen.

+0

Es tut mir leid, aber das ist eine Nicht-Antwort. "Versuchen Sie einen Workaround"? Wie wäre es mit einem Beispiel oder etwas hilfreich? Bitte sehen Sie die Antwort unten - es hat einen Workaround und sogar ein funktionierendes Beispiel! – richb01

12

Ich könnte zu spät sein, um dies zu beantworten, aber sicherlich viele von Ihnen mögen mich auf der Suche nach dieser Antwort soll die Lösung zu erfüllen. Sie können eine perfekt funktionierende Lösung von iText finden, wo Benutzer den Text iText bearbeiten kann, die ein Teil eines fabric.group ist Working solution

Ansatz hier gefolgt ist:

  1. Wenn Benutzer doppelt klickt die gewünschte Gruppe, wir
  2. alle Elemente
  3. Set Fokus auf iText Element Gruppierung aufheben Eingabe der Bearbeitungsmodus von iText & den gesamten Text auswählen, so dass Benutzer die direkte Bearbeitung beginnen ..
  4. Sobald der Benutzer den Bearbeitungsmodus verlässt, werden die Elemente erneut gruppiert.

    // ungroup objects in group 
    var items 
    var ungroup = function (group) { 
        items = group._objects; 
        group._restoreObjectsState(); 
        canvas.remove(group); 
        for (var i = 0; i < items.length; i++) { 
         canvas.add(items[i]); 
        } 
        // if you have disabled render on addition 
        canvas.renderAll(); 
    }; 
    
    // Re-group when text editing finishes 
    var dimensionText = new fabric.IText("Dimension Text", { 
        fontFamily: 'Comic Sans', 
        fontSize: 14, 
        stroke: '#000', 
        strokeWidth: 1, 
        fill: "#000", 
        left: 170, 
        top: 60 
    }); 
    dimensionText.on('editing:exited', function() { 
        var items = []; 
        canvas.forEachObject(function (obj) { 
         items.push(obj); 
         canvas.remove(obj); 
        }); 
        var grp = new fabric.Group(items.reverse(), {}); 
        canvas.add(grp); 
        grp.on('mousedown', fabricDblClick(grp, function (obj) { 
         ungroup(grp); 
         canvas.setActiveObject(dimensionText); 
         dimensionText.enterEditing(); 
         dimensionText.selectAll(); 
        })); 
    }); 
    
+0

Das ist ausgezeichnet - danke! – richb01

+0

Leider funktioniert dies nicht mehr für Version 1.7.1+. Das Lineal wird nicht wiederhergestellt, nachdem die IText entfernt wurde und der folgende Fehler in der Konsole angezeigt wird: '' TypeError: this._objects [i] is undefined''. –

0

Danke für die Antwort, es ist jedoch nicht sicherstellen, dass nur die Elemente in der Gruppe neu gruppiert werden, müssen wir, wie es wird ‚canvas.forEachObject‘ auf ‚Groupitem‘ ändern Versuchen Sie, alle Elemente in der Zeichenfläche zurückzusetzen, die nur zu der Gruppe gehören. Siehe den folgenden Code

// ungroup objects in group 
var groupItems = [] 
var ungroup = function (group) { 
    groupItems = group._objects; 
    group._restoreObjectsState(); 
    canvas.remove(group); 
    for (var i = 0; i < groupItems.length; i++) { 
     canvas.add(groupItems[i]); 
    } 
    // if you have disabled render on addition 
    canvas.renderAll(); 
}; 

// Re-group when text editing finishes 
var dimensionText = new fabric.IText("Dimension Text", { 
    fontFamily: 'Comic Sans', 
    fontSize: 14, 
    stroke: '#000', 
    strokeWidth: 1, 
    fill: "#000", 
    left: 170, 
    top: 60 
}); 
dimensionText.on('editing:exited', function() { 
    var items = []; 
    groupItems.forEach(function (obj) { 
     items.push(obj); 
     canvas.remove(obj); 
    }); 
    var grp = new fabric.Group(items.reverse(), {}); 
    canvas.add(grp); 
    grp.on('mousedown', fabricDblClick(grp, function (obj) { 
     ungroup(grp); 
     canvas.setActiveObject(dimensionText); 
     dimensionText.enterEditing(); 
     dimensionText.selectAll(); 
    })); 
});