2015-10-13 36 views
6

Bazı ek özellikler sağlamak için Handsontable civarında bir sarıcı oluşturmaya çalışıyorum. Aşağıdakileri yapmayı denedim ve yapıcı çalışmasına rağmen, loadData işlevi geçersiz kılmıyor gibi görünüyor. Herhangi bir tavsiye?Handsontable'ı Genişletme

Bunu 45.0.2454.101m numaralı Chrome'da test ettik.

"use strict"; 

class CustomHandsontable extends Handsontable { 

    constructor(container, options) { 
     console.log("in constructor"); 
     super(container, options); 
    } 

    loadData(data) { 
     console.log("load data"); 
     super.loadData(data); 
    } 
} 

DÜZENLEME: Krom henüz tam ECMA6 desteklemediği okuduktan sonra aşağıdaki denedim ama oldukça üst LoadData yöntemini çağırmak anlamaya olamaz.

function CustomHandsontable (container, options) { 
    console.log("constructor"); 

    this.loadData = function(data) { 
     console.log("loadData"); 
     // TODO how do you call the parent load data function? 
    } 
}; 

CustomHandsontable.prototype = Object.create(Handsontable.prototype); 
CustomHandsontable.prototype.constructor = CustomHandsontable; 

DÜZENLEME:

Uncaught TypeError: Cannot read property 'call' of undefined 

Babel code:

"use strict"; 

var _createClass = (function() { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); 

var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; 

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 

var Hot = (function (_Handsontable) { 
    _inherits(Hot, _Handsontable); 

    function Hot(localOptions, container, options) { 
     _classCallCheck(this, Hot); 

     console.log("in constructor"); 
     _get(Object.getPrototypeOf(Hot.prototype), "constructor", this).call(this, container, options); 
    } 

    _createClass(Hot, [{ 
     key: "loadData", 
     value: function loadData(data) { 
      console.log("load data"); 
      _get(Object.getPrototypeOf(Hot.prototype), "loadData", this).call(this, data); 
     } 
    }]); 

    return Hot; 
})(Handsontable); 
+0

ES6 kodunuzu ES5'e aktarmak için Babel'i kullanmayı denediniz mi? Bu günlerde kod yazmak için oldukça standart bir yol. Handsontable, halihazırda ES6 ve ES7 kodlama kararlarını kabul ettiği için tavsiye edilebilir. – ZekeDroid

+0

@ZekeDroid: Babel'deki bahşiş için teşekkürler. Denedim, ancak bir hata alıyorum (güncellenmiş yazıma bakın). –

+0

Evet, bundan ne yapacağımdan emin değilim. Sadece merak ettim, Handsontable'ı genişletmene gerek var mı? Özel yapımların nasıl oluşturulacağına dair belgelerini okuyabilirsiniz, aksi halde normal veri manipülasyonlarının ve JS'nin amaçlarına hizmet etmediği neredeyse hiçbir durumun olmadığını tespit ettim – ZekeDroid

cevap

2

cevaplama ucu Babel kullanmak takiben @ZekeDroids, ben onun süper sınıfları LoadData işlevini çağırmak çalışıyor aşağıdaki hatayı alıyorum kendi sorum ...

Kalıtım t o iş, ama kompozisyon kullanarak bir çözüm buldunuz:

function Hot(container, options, customOptions) { 
    var _instance = this; 

    // create a hot instance 
    var hot = new Handsontable(container, options); 
    hot._hotContainer = this; 

    // 
    // put any custom stuff here... 
    // 

    // 
    // since inheritance doesn't quite work, the following are all pass-through 
    // functions to cover the fact that composition is being used 
    // 

    this.loadData = function(data) { 
     hot.loadData.apply(this, arguments); 
    } 
    this.render = function() { 
     hot.render.apply(this, arguments); 
    } 
    this.getDataAtRow = function() { 
     return hot.getDataAtRow.apply(this, arguments); 
    } 
    this.countCols = function() { 
     return hot.countCols.apply(this, arguments); 
    } 
    this.sort = function() { 
     hot.sort.apply(this, arguments); 
    } 
};