#angular #typescript #canvas
#angular #typescript #холст
Вопрос:
Я пытаюсь нарисовать круг на холсте в Angular. Я все делаю нормально и вроде понимаю, как все это работает. IDE не выдает ошибок, но когда я запускаю код, консоль выдает сообщение «this.circleApp не определено». Я несколько раз пытаюсь ссылаться на свойства объекта circleApp, где я намерен хранить большую часть данных и логики моего приложения (например, вычисляя радианы из градусов и, таким образом, определяя координаты, в которых должны находиться мои фигуры). Я очень новичок в Angular и TypeScript и чувствую, что упускаю что-то очевидное. Если бы кто-нибудь мог сказать мне, что это такое, или просто указать мне правильное направление и дать ссылку на соответствующие документы, я был бы очень благодарен. иллюстрация того, где, по моему мнению, проблема
Прямо сейчас я сохраняю только случайное число в качестве значения свойства «degrees», но позже я хочу подключить его к вводу.
import { ViewChild, Component, OnInit, ElementRef } from "@angular/core";
import { CircleApp } from "./circleApp";
@Component({
selector: "app-make-circle",
templateUrl: "./make-circle.component.html",
styleUrls: ["./make-circle.component.css"]
})
export class MakeCircleComponent implements OnInit {
circleApp: CircleApp = {
degrees: 3,
degreesToRadiansFlipped: function(degree) {
return (-degree * Math.PI) / 180;
},
radian: this.circleApp.degreesToRadiansFlipped(this.circleApp.degrees),
x: Math.cos(this.circleApp.radian * 200 500),
y: Math.sin(this.circleApp.radian * 200 500)
};
@ViewChild("myCanvas") myCanvas: ElementRef;
public context: CanvasRenderingContext2D;
constructor() {}
ngOnInit() {}
ngAfterViewInit(): void {
this.context = (this.myCanvas
.nativeElement as HTMLCanvasElement).getContext("2d");
this.draw();
}
private draw() {
this.context.beginPath();
this.context.arc(500, 300, 200, 0, Math.PI * 2);
this.context.moveTo(500, 300);
this.context.lineTo(this.circleApp.x, this.circleApp.y);
this.context.stroke();
}
}
Комментарии:
1. Что такое
CircleApp
? Как это выглядит в./circleApp
? Можете ли вы добавить это к сообщению?2. Это экспорт класса typescript, где я определяю, к каким типам относится каждое свойство CircleApp. В этом случае он говорит только: экспортировать класс CircleApp { degrees: number; }
Ответ №1:
На самом деле, эти строки являются проблемой (хорошо, может быть, это просто проблема):
radian: this.circleApp.degreesToRadiansFlipped(this.circleApp.degrees),
x: Math.cos(this.circleApp.radian * 200 500),
y: Math.sin(this.circleApp.radian * 200 500)
this.circleApp
ссылается на this.circleApp
, который еще не создан. В упрощенной форме вы пытаетесь сделать это:
let foo = { a: "A", b: foo.a "B" };
Если вы замените ссылки this.circleApp
с правой стороны на некоторые числовые значения или закомментируете их, ошибка исчезнет.
Вам просто нужно инициализировать circleApp
каким-либо другим способом. Если это класс, просто поместите this.circleApp = new CircleApp(/* parameters here */)
его где-нибудь достаточно рано в жизненный цикл компонента, например ngOnInit
.
Комментарии:
1. Спасибо, я переместил ссылки этого.circleApp в @ngAfterViewInit(), и теперь он работает нормально.