2013-10-18 83 views
7

我正在尋找一種方法來擴展基本fabric.Object類與自定義屬性我可以保存到JSON和從JSON加載,將傳播到各種子類。在Fabric.js中,如何修改對象類,以便所有子類都具有新的自定義屬性?

具體而言,我想存儲一個深度屬性,所以當我從JSON加載對象時,我將能夠添加適當的視差到對象。

我想解決方案將包括修改fabric.Object.prototype。但我仍然在學習如何使用原型。

這裏是什麼,我已經嘗試了一些例子: 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
  - 完全重寫,以包括自定義屬性所需的方法(我寧願不修改fabricjs核心)

回答

7

最簡單的方法是隻指定您想要包含哪些屬性時調用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){ 回報函數(){ 返回fabric.util.object.extend(toObject.call(本),{ 動畫:this.anim }); }; })(fabric.Object.prototype.toObject); –

相關問題