2013-02-24 39 views
2

我正在使用本教程構建可拖動的多邊形。 TutorialKineticJS Uncaught TypeError:更新後無法讀取未定義屬性'x'

現在我想添加文本到它並試圖從kinetic-v3.10.0.js更新到一個新的。 但更新後,我總是得到提到的錯誤信息。

有人可以看看我的代碼,並幫我看看我需要改變什麼,它可能會再次工作?

這裏是我的代碼部分:

建立錨

function buildAnchor(layer, x, y, name) { 
var anchor = new Kinetic.Circle({ 
    x: x, 
    y: y, 
    radius: 12, 
    stroke: 'red', 
    fill: '#ddd', 
    strokeWidth: 4, 
    draggable: true, 
    name : name 
}); 

// add hover styling 
anchor.on('mouseover', function() { 
    document.body.style.cursor = 'pointer'; 
    this.setStrokeWidth(6); 
    layer.draw(); 
}); 
anchor.on('mouseout', function() { 
    document.body.style.cursor = 'default'; 
    this.setStrokeWidth(4); 
    layer.draw(); 
}); 

layer.add(anchor); 
return anchor;} 

構建線:

function buildLine(layer, x1, y1, x2, y2, name) { 
var line = new Kinetic.Line({ 
    points: [x1, y1, x2, y2], 
    stroke : '#000', 
    strokeWidth : 2, 
    name : name 
}); 

var xDiff = x1 - x2; 
var yDiff = y1 - y2; 

var text = new Kinetic.Text({ 
    x: 0, 
    y: 0, 
    text: 'Test', 
    fontSize: 20, 
    fontFamily: 'Calibri', 
    fill: 'green' 
}); 


if (xDiff < 0 && yDiff == 0) { 
    line.move(0,-30); //Point a -> b 
} 
else if (xDiff == 0 && yDiff < 0) { 
    line.move(30,0); //Point b -> c 
} 
else if (xDiff > 0 && yDiff == 0) { 
    line.move(0,30); //Point c -> d 
} 
else if (xDiff == 0 && yDiff > 0) { 
    line.move(-30,0); //Point d -> a 
} 
else if (xDiff < 0 && yDiff < 0) { 
    line.move(0,-30);  
} 
else if (xDiff < 0 && yDiff > 0) { 
    line.move(0,-30); 
} 
else if (xDiff > 0 && yDiff > 0) { 
    line.move(-5,30); 
} 

layer.add(text); 
layer.add(line); 
return line; 
return text;} 

構建三角:

function buildTriangle(layer, points, name) { 
var triangle = new Kinetic.Polygon({ 
    stroke : '#666', 
    strokeWidth : 8, 
    name : name 
}); 

triangle.scaleAnchor = function(anchor, factor) { 
    anchor.attrs.x = (anchor.attrs.x - this.center.x) * factor + this.center.x; 
    anchor.attrs.y = (anchor.attrs.y - this.center.y) * factor + this.center.y; 
}; 
triangle.calculateCenter = function() { 
    this.center.x = (this.a.attrs.x + this.b.attrs.x + this.c.attrs.x)/3; 
    this.center.y = (this.a.attrs.y + this.b.attrs.y + this.c.attrs.y)/3; 
}; 

triangle.a = buildAnchor(layer, points[0], points[1], 'anchor'); 
triangle.b = buildAnchor(layer, points[2], points[3], 'anchor'); 
triangle.c = buildAnchor(layer, points[4], points[5], 'anchor'); 
line1 = buildLine(layer, points[0], points[1], points[2], points[3], 'line'); 
line2 = buildLine(layer, points[2], points[3], points[4], points[5], 'line'); 
line3 = buildLine(layer, points[4], points[5], points[0], points[1], 'line'); 
triangle.was = { x : 0, y : 0 }; 
triangle.center = { x : 0, y : 0 }; 

layer.add(triangle); 
return triangle;} 

繪製三角形:

function drawtriangle() { 
var triangle = this.get('.triangle')[0]; 

triangle.setPoints([ triangle.a.attrs.x - triangle.was.x, 
         triangle.a.attrs.y - triangle.was.y, 
         triangle.b.attrs.x - triangle.was.x, 
         triangle.b.attrs.y - triangle.was.y, 
         triangle.c.attrs.x - triangle.was.x, 
         triangle.c.attrs.y - triangle.was.y ]); 
line1.setPoints([triangle.a.attrs.x - triangle.was.x, triangle.a.attrs.y - triangle.was.y, triangle.b.attrs.x - triangle.was.x, triangle.b.attrs.y - triangle.was.y]); 
line2.setPoints([triangle.b.attrs.x - triangle.was.x, triangle.b.attrs.y - triangle.was.y, triangle.c.attrs.x - triangle.was.x, triangle.c.attrs.y - triangle.was.y]); 
line3.setPoints([triangle.c.attrs.x - triangle.was.x, triangle.c.attrs.y - triangle.was.y, triangle.a.attrs.x - triangle.was.x, triangle.a.attrs.y - triangle.was.y]); 

triangle.calculateCenter.apply(triangle);} 
+0

這裏是整個代碼的jsfiddle: jsfiddle.net/GByKu/1/ – 2013-02-24 15:02:09

+0

你什麼時候收到錯誤信息?我不明白。你在jsFiddle中使用kinetic-v3.10.0.js。這是否是正確的版本來重現您的問題? – 2013-02-24 15:23:04

+0

當我嘗試切換到更新的版本(例如kinetic-v4.3.2.js)時,爲了實現文本功能,我得到錯誤,並且畫布中不顯示任何內容。我的例子jsfiddle顯示了它應該如何工作。 – 2013-02-24 15:30:15

回答

0

沒有閱讀和測試您的所有代碼,但我發現一個錯誤是。

function buildLine(layer, x1, y1, x2, y2, name) { 
    .... 
    .... 
    return line; 
    return text; 
} 

您可以在函數返回只有一個。您的buildLine函數絕不會顯示文本,但僅限行。所有與文本相關的操作都將失敗。

+0

thx爲您反饋。我會改變它,但它會接縫工作,儘管它只能返回一個。請看看這兩個版本與kinetic 3.10.0,不工作文本,工作polygone拖動(jsfiddle.net/GByKu/1/)和動力學4.3.1,工作文本,不工作多邊形拖動(jsfiddle.net/GByKu/ 4 /)。 – 2013-02-24 19:13:39

相關問題