2017-09-14 1 views
0

J'utilise des attributs personnalisés lorsque je crée mes objets. Par exemple dans ce cas "nom" et "icône":FabricJS et AngularJS - copier et coller un objet avec un attribut personnalisé

$scope.addRoundRect = function() { 
    var coord = getRandomLeftTop(); 

    var roundrect = (new fabric.Rect({ 
     left: coord.left, 
     top: coord.top, 
     fill: '#' + getRandomColor(), 
     width: 250, 
     height: 250, 
     opacity: 1, 
     scaleX: 1, 
     scaleY: 1, 
     angle: 0, 
     rx: 10, 
     ry: 10, 
     strokeWidth: 0, 
     name: "Rounded Rectangle", 
     icon: "crop-square" 
    })); 
    canvas.add(roundrect).setActiveObject(roundrect); 
}; 

Ceci est ma fonction Copier/Coller. Comme vous pouvez le voir, je l'ai déjà essayé de coller les attributs pertinents - bu, je pense qu'ils sont tout simplement pas clonés avec l'objet:

function copy() { 
    canvas.getActiveObject().clone(function (cloned) { 
     _clipboard = cloned; 
    }); 
} 

function paste() { 
    _clipboard.clone(function (clonedObj) { 
     canvas.discardActiveObject(); 
     clonedObj.set({ 
      left: clonedObj.left + 10, 
      top: clonedObj.top + 10, 
      evented: true, 
      name: clonedObj.name, 
      icon: clonedObj.icon, 
     }); 
     if (clonedObj.type === 'activeSelection') { 
      clonedObj.canvas = canvas; 
      clonedObj.forEachObject(function (obj) { 
       canvas.add(obj); 
      }); 
      clonedObj.setCoords(); 
     } else { 
      canvas.add(clonedObj); 
     } 
     canvas.setActiveObject(clonedObj); 
     canvas.requestRenderAll(); 
    }); 

Pour faire court: est-il un moyen de cloner et coller également cet attribut sans avoir à modifier la source (c'est-à-dire implémenter un attribut personnalisé à part entière dans la sérialisation JSO)?

Répondre

0

var canvas = new fabric.Canvas('c'); 
 
var roundrect = new fabric.Rect({ 
 
    left: 50, 
 
    top: 30, 
 
    fill: 'blue', 
 
    width: 250, 
 
    height: 250, 
 
    opacity: 1, 
 
    scaleX: 1, 
 
    scaleY: 1, 
 
    angle: 0, 
 
    rx: 10, 
 
    ry: 10, 
 
    strokeWidth: 0, 
 
    name: "Rounded Rectangle", 
 
    icon: "crop-square" 
 
}); 
 
canvas.add(roundrect).setActiveObject(roundrect); 
 

 
var customProperties = 'name icon'.split(' '); 
 

 
function copy() { 
 
    canvas.getActiveObject().clone(function(cloned) { 
 
    console.log(cloned); 
 
    _clipboard = cloned; 
 
    }, customProperties); 
 
} 
 

 
function paste() { 
 
    // clone again, so you can do multiple copies. 
 
    _clipboard.clone(function(clonedObj) { 
 
    canvas.discardActiveObject(); 
 
    clonedObj.set({ 
 
     left: clonedObj.left + 10, 
 
     top: clonedObj.top + 10, 
 
     evented: true, 
 
    }); 
 
    if (clonedObj.type === 'activeSelection') { 
 
     // active selection needs a reference to the canvas. 
 
     clonedObj.canvas = canvas; 
 
     clonedObj.forEachObject(function (obj) { 
 
      canvas.add(obj); 
 
     }); 
 
     // this should solve the unselectability 
 
     clonedObj.setCoords(); 
 
    } else { 
 
     canvas.add(clonedObj); 
 
    } 
 
    canvas.setActiveObject(clonedObj); 
 
    canvas.requestRenderAll(); 
 
    console.log(clonedObj); 
 
    
 
    _clipboard = clonedObj; 
 
},customProperties); 
 
}
canvas { 
 
border: blue dotted 2px; 
 
}
<script src="https://rawgit.com/kangax/fabric.js/master/dist/fabric.min.js"></script> 
 
<button onclick='copy()'>copy</button> 
 
<button onclick='paste()'>paste</button><br> 
 
<canvas id="c" width="400" height="400"></canvas>

object.clone accepte la fonction de rappel et toute propriété supplémentaire que vous souhaitez inclure un autre paramètre. Vous pouvez envoyer votre nom et votre icône en tant que propriétés à inclure.

Et en pâte vous n'avez pas besoin de cloner cet objet si vous le faites, assurez-vous qu'il y a aussi des propriétés supplémentaires.

+0

- merci encore! Mais en utilisant ceci dans mon contrôleur (copie collée ici) je reçois "controller.js: 267 Unrefried ReferenceError: customProperties n'est pas défini" tandis que copy et "Uncaught ReferenceError: _clipboard n'est pas défini" lors du collage de l'objet. –

+0

- merci encore! Mais en utilisant ceci dans mon contrôleur (copie collée ici) je reçois "controller.js: 267 Unrefried ReferenceError: customProperties n'est pas défini" tandis que copy et "Uncaught ReferenceError: _clipboard n'est pas défini" lors du collage de l'objet. En ce qui concerne le clone dans la fonction de collage. Voir ce violon que nous avons travaillé avec @asturur et (mais maintenant je ne sais vraiment pas où je devrais ajouter le "customProperties" dans ce contexte ... Fiddle: https://jsfiddle.net/wta4pdpz/14/ –

+0

- Désolé mon pote, je suis un peu surchargé! J'ai juste raté une ligne de code ... ;-(Copier et coller fonctionne maintenant, il faut maintenant vérifier plusieurs copies (la solution dans notre violon) .... MERCI !!! –