Угловой холст не определен внутри обработчика прослушивателя событий

#angular #typescript

Вопрос:

Я использую холст внутри углового. Я получаю холст через ViewChild. Приведенный ниже код показывает, как/где я получаю ошибку. Сначала у меня были функции со стрелками, в которых я добавлял прослушиватель событий (что работало нормально), но поскольку теперь мне также нужно удалить прослушиватели событий при определенных обстоятельствах, мне пришлось создать функции для обработчиков событий. И как только я добавил функции для обработчиков событий, он перестал работать. Он начал говорить, что использование this.context и this.canvas не определено.

Одна из ошибок:

core.js:6210 ERROR TypeError: Cannot read properties of undefined (reading 'beginPath')

 @ViewChild('canvas', { static: false }) canvas: ElementReflt;HTMLCanvasElementgt;; public context: CanvasRenderingContext2D;  ngOnInit(): void {  this.refresh(); }  private refresh(): void {  this.blahblah.blah().subscribe(() =gt; {  this.initCanvas();  }); }  private initCanvas(): void {  if(something) {  this.canvas.nativeElement.addEventListener('mouseup', this.mouseUpEvent);  this.canvas.nativeElement.addEventListener(  'mousedown',  this.mouseDownEvent  );  this.canvas.nativeElement.addEventListener(  'mousemove',  this.mouseMoveEvent  );  } else {  this.canvas.nativeElement.removeEventListener(  'mouseup',  this.mouseUpEvent  );  this.canvas.nativeElement.removeEventListener(  'mousedown',  this.mouseDownEvent  );  this.canvas.nativeElement.removeEventListener(  'mousemove',  this.mouseMoveEvent  );   } }  public mouseUpEvent(): void {  this.drawing = false;  this.context.beginPath(); }  public mouseDownEvent(): void {  this.drawing = true; }  public mouseMoveEvent(event: any): void {  console.log(this.canvas); //UNDEFINED  if (!this.drawing) return;   const rect = this.canvas.nativeElement.getBoundingClientRect();  const x = Math.round(  ((event.clientX - rect.left) / (rect.right - rect.left)) *  this.canvas.nativeElement.width  );  const y = Math.round(  ((event.clientY - rect.top) / (rect.bottom - rect.top)) *  this.canvas.nativeElement.height  );   this.context.lineWidth = 5;  this.context.lineCap = 'round';   this.context.lineTo(x, y);  this.context.stroke();  this.context.beginPath();  this.context.moveTo(x, y); }  

Комментарии:

1. То же самое относится и здесь, вам нужно использовать функцию стрелки или привязку this , так как в противном случае вы потеряете контекст this . Итак, используйте функцию стрелки или bind(this) , например this.mouseUpEvent.bind(this)

2. вы пробовали установить @ViewChild('sidenav', { static: true })

3. @AJT82 ответил на мой вопрос, но я не могу принять комментарий.