Search code examples
javascripthtmlhtml5-canvasthiskineticjs

Making JS "this" work in prototype function


Being new to Javascript, my understanding of this is a bit shaky. I've read a few articles and SO posts and learned quite a bit, but I'm having issues implementing some code. I'm using the KineticJS library to implement some canvas functions. I was working with a fiddle and was able to get an image to resize with the mouse control, however, when I put the code into a prototype function, resizing no longer works.

Canvas.prototype.addImg = function(){
  var self = this;
  var image;
  var imageObj = new Image();
  imageObj.onload = function() {
    image = new Kinetic.Image({
      x: 200,
      y: 50,
      image: imageObj,
      width: 106,
      height: 118,
      draggable: false
    });

    self.backgroundLayer.add(image);
    self.stage.add(self.backgroundLayer);
  };
  imageObj.src = 'http://www.html5canvastutorials.com/demos/assets/yoda.jpg';

  var circle1 = new Kinetic.Circle({
        x: 150,
        y: 150,
        radius: 10,
        fill: 'red',
        stroke: 'black',
        strokeWidth: 4,
        draggable: false
    });
    circle1.isResizing = false;
    circle1.on("click", function (e) {
        // toggle resizing true/false
        var isResizing = !this.isResizing;
        this.setDraggable(isResizing);
        self.backgroundLayer.setDraggable(!isResizing);
        this.setFill((isResizing ? "green" : "red"));
        this.isResizing = isResizing;
        self.backgroundLayer.draw();
    });
    circle1.on("dragmove", function () {
        if (this.isResizing) {
            var pos = this.getPosition();
            var x = pos.x;
            var y = pos.y;
            var rectX = image.getX();
            var rectY = image.getY();
            image.setSize(x - rectX, y - rectY);
            self.backgroundLayer.draw();
        }
    });
    self.backgroundLayer.add(circle1);
    self.backgroundLayer.draw();

}

I am assuming the problem lies within the use of this in the function, but I'm not sure how to fix the problem. Could somebody tell me what the problem is and how I would fix this?


Solution

  • I can see a problem with the line that is setting the size of image:

    image.setSize(x - rectX, y - rectY);
    

    For example if x is 100 and rectX is 200, you end up with a width of '-100', which is not legal.

    In the fiddle you provided, when I use constant values, the image re-sizes perfectly:

    rect.setSize(200, 200);
    

    Modified fiddle.