جافاسكريبت - شكل KineticJS في تايبسكريبت
أحاول إنشاء شكل استنادًا إلى كود JavaScript التالي باستخدام kineticjs:
var triangle = new Kinetic.Shape({
drawFunc: function(canvas) {
var context = canvas.getContext();
context.beginPath();
context.moveTo(200, 50);
context.lineTo(420, 80);
context.quadraticCurveTo(300, 100, 260, 170);
context.closePath();
canvas.fillStroke(this);
},
fill: '#00D2FF',
stroke: 'black',
strokeWidth: 4
});
هذا نموذج يمكن العثور عليه على: http://www.html5canvastutorials.com/kineticjs/html5-canvas-kineticjs-shape-tutorial/
يبدو TypeScript الخاص بي هكذا:
var square = new Kinetic.Shape({
drawFunc: (canvas: any) => {
var ctx = canvas.getContext();
ctx.beginPath();
ctx.moveTo(25, 25);
ctx.lineTo(475, 25);
ctx.lineTo(475, 475);
ctx.lineTo(25, 475);
ctx.closePath();
canvas.fillStroke(this);
},
fill: '#FF0000',
});
يشبه الجافاسكريبت المولّد هذا:
var square = new Kinetic.Shape({
drawFunc: function (canvas) {
var ctx = canvas.getContext();
ctx.beginPath();
ctx.moveTo(25, 25);
ctx.lineTo(475, 25);
ctx.lineTo(475, 475);
ctx.lineTo(25, 475);
ctx.closePath();
canvas.fillStroke(_this);
},
fill: '#FF0000'
});
تحدث المشكلة في السطر canvas.fillStroke(_this). يشير _this إلى فئة TypeScript الخاصة بي وليس إلى الشكل الناتج كما هو الحال في مثال JavaScript. حاولت أيضًا استبدال canvas.fillStroke(this) في TypeScript الخاص بي بـ () => canvas.fillStroke(this)، لكن النتيجة كانت نفسها.
أي أفكار؟
الإجابة رقم 1
أعتقد أنك تحتاج فقط لتجنب تدوين السهم الدهني، الذي يحتفظ عن قصد بالسياق الحالي لـ this كـ _this.
لذا drawFunc: (canvas: any) => { يجب أن تكون drawFunc: function(canvas:any){ إلخ.
شاهد الفرق هنا: http://bit.ly/10cpdWw
التعليقات هنا مفيدة بخصوص _this و this: http://typescript.codeplex.com/workitem/248