2013-10-18 5 views
7

मैं आधार कपड़े का विस्तार करने का एक तरीका ढूंढ रहा हूं। एक कस्टम विशेषता के साथ ऑब्जेक्ट क्लास मैं जेएसओएन को सहेज सकता हूं और जेएसओएन से लोड कर सकता हूं जो विभिन्न उप वर्गों में सभी तरह से प्रचार करेगा।Fabric.js में मैं ऑब्जेक्ट क्लास को कैसे संशोधित करूं ताकि सभी उप-वर्गों में एक नई कस्टम विशेषता होगी?

विशेष रूप से मैं एक गहराई विशेषता संग्रह करना चाहता हूं ताकि जब मैं JSON से ऑब्जेक्ट लोड करता हूं तो मैं ऑब्जेक्ट में उचित लंबन जोड़ सकता हूं।

मुझे लगता है कि समाधान में कपड़े को संशोधित करना शामिल होगा। ऑब्जेक्ट.प्रोटोटाइप। लेकिन मैं अभी भी सीख रहा हूं कि प्रोटोटाइप के साथ कैसे काम करना है।

यहाँ मैं क्या कोशिश की है के कुछ उदाहरण है: http://www.sitepoint.com/fabric-js-advanced/

// create a rectangle object 
var rect = new fabric.Rect({ 
    left: 100, 
    top: 100, 
    fill: 'red', 
    width: 20, 
    height: 20 
}); 

rect.toObject = (function (toObject) { 
    return function() { 
     return fabric.util.object.extend(toObject.call(this), { 
      depth: 10 
     }); 
    }; 
})(rect.toObject); 

यह करता है, विशिष्ट वस्तु 'रेक्ट' विशेषता वांछित देने के साथ-साथ toJSON() विधि में यह उपलब्ध बनाने में एक बहुत अच्छा काम । लेकिन यह सभी वस्तुओं के लिए इसे उपलब्ध कराने में विफल रहता है और जब मैं loadFromJSON() का उपयोग करता हूं तो इसमें नई विशेषता नहीं होती है।

किसी भी मदद की सराहना की जाएगी!

अन्य संसाधनों है कि मुझे एक समाधान के करीब हो गया है:

Fabric.js - how to save canvas on server with custom attributes
  - कस्टम विशेषताओं के साथ एक उपवर्ग बनाता है लेकिन कुछ भी इसे से इनहेरिट करती है।

https://github.com/kangax/fabric.js/wiki/Adding-additional-object-properties-to-serialized-JSON
  - पूरी तरह से तरीकों आदेश कस्टम विशेषताओं को शामिल करने की जरूरत का पुनर्लेखन

उत्तर

7

सबसे आसान तरीका सिर्फ निर्दिष्ट करने के लिए जो गुण आप शामिल करना चाहते हैं जब होगा (मैं fabricjs के मूल को संशोधित करने के लिए नहीं पसंद करेंगे) toJSON बुला:

canvas.toJSON([ 'selectable', 'lockMovementX' ]); 

लेकिन क्या तुम सच में-वास्तव में उत्पादन के लिए उन्हें जोड़ने के लिए चाहते हैं, तो आप कर सकते हैं बंदर-पैच fabric.Object.prototype.toObject उसी तरह यह आयत के साथ किया जाता है:

fabric.Object.prototype.toObject = (function (toObject) { 
    return function() { 
     return fabric.util.object.extend(toObject.call(this), { 
      foobar: 123 
     }); 
    }; 
})(fabric.Object.prototype.toObject); 
+0

यह पूरी तरह से काम किया। धन्यवाद! मैं आपके बंदर-पैच का उपयोग कर समाप्त हुआ क्योंकि मैं फिर नई विशेषता में हेरफेर कर सकता हूं और साथ ही उन्हें बचा सकता हूं। – payne8

+1

इस उदाहरण में 'foobar' के लिए कोई तर्क कैसे पारित कर सकता है? –

+0

fabric.Object.prototype.toObject = (समारोह (toObject) { वापसी function() { वापसी fabric.util.object.extend (toObject.call (यह), { anim: this.anim }); }; }) (fabric.Object.prototype.toObject); –

संबंधित मुद्दे