Javascript 与angular一起使用时,p5.js中未定义变量?

Javascript 与angular一起使用时,p5.js中未定义变量?,javascript,angular,typescript,p5.js,Javascript,Angular,Typescript,P5.js,我正在学习WebGL,并开始使用p5.js和angular开发一个草图应用程序。我在组件文件中定义了布尔变量,因此我希望在此基础上触发绘图函数中的特定函数,如椭圆、矩形、直线等。这些布尔变量由另一个组件中的按钮管理 我收到的错误为core.js:6014错误类型错误:无法读取未定义的属性“isRectangleMode” 组件文件: import { Component, OnInit } from '@angular/core'; import * as p5 from 'p5'; imp

我正在学习WebGL,并开始使用p5.js和angular开发一个草图应用程序。我在组件文件中定义了布尔变量,因此我希望在此基础上触发绘图函数中的特定函数,如椭圆、矩形、直线等。这些布尔变量由另一个组件中的按钮管理

我收到的错误为core.js:6014错误类型错误:无法读取未定义的属性“isRectangleMode”

组件文件:

import { Component, OnInit } from '@angular/core';

import * as p5 from 'p5';

import { Subscription } from 'rxjs';

import { HomeService } from '../home.service';

@Component({
  selector: 'app-doodle-area',
  templateUrl: './doodle-area.component.html',
  styleUrls: ['./doodle-area.component.css']
})
export class DoodleAreaComponent implements OnInit {

  private p5Init : any;

  modeSubs : Subscription;
  modeSelected : string = null;
  isCircleMode : boolean = false;
  isEllipseMode : boolean = false;
  isRectangleMode : boolean = false;
  isLineMode : boolean = false;
  isPointMode : boolean = false;
  isBrushMode : boolean = false;
  isPenMode : boolean = false;

  constructor(private homeService : HomeService) { }

  ngOnInit() {
    this.createCanvas();

    this.homeService.modeSelected
      .subscribe(modeSelected => {
        this.modeSelected = modeSelected;
        console.log(this.modeSelected);
        if(this.modeSelected) {
          this.modeReset();
          if(this.modeSelected === "circle") {
            this.isCircleMode = true;
          } else if(this.modeSelected === 'ellipse') {
            this.isEllipseMode = true;
          } else if(this.modeSelected === 'rectangle') {
            this.isRectangleMode = true;
          } else if(this.modeSelected === 'line') {
            this.isLineMode = true;
          } else if(this.modeSelected === 'point') {
            this.isPointMode = true;
          } else if(this.modeSelected === 'brush') {
            this.isBrushMode = true;
          } else if(this.modeSelected === 'pen') {
            this.isPenMode = true;
          }
        }
      });
  }

  private modeReset() {
    this.isCircleMode = false;
    this.isEllipseMode = false;
    this.isRectangleMode = false;
    this.isLineMode = false;
    this.isPointMode = false;
    this.isBrushMode = false;
    this.isPenMode = false;
  }

  private createCanvas() {
    this.p5Init = new p5(this.doodleArea);
  }

  private doodleArea(p : any) {

    p.setup = () => {
      p.createCanvas(p.windowWidth - 440, p.windowHeight - 200).parent('doodle-area');
      p.background(206,214,224);
      p.createP("Hello");
    }

    p.draw = () => {

      if(this.isRectangleMode) {
        console.log("Rectangle");
      }

      p.stroke(0);
      if(p.mouseIsPressed === true) { 
        p.line(p.mouseX, p.mouseY, p.pmouseX, p.pmouseY); 
      }
    }
  }

}
控制台屏幕截图:


这是由于范围问题。在回调函数doodleArea中,作用域不是组件作用域(
this
)。此处未定义,我们无法访问未定义的isRectangleMode。可能的解决办法是:

在.ts中,使用下面给出的代码修改
createCanvas()

private createCanvas() {
  const doodleArea = s => {
  s.setup = () => {
    let canvas = s.createCanvas(s.windowWidth - 440, s.windowHeight - 200);
    canvas.parent("doodle-area");
    s.draw = () => {
      if (this.isRectangleMode) {
        console.log("Rectangle");
      }

      s.stroke(0);
      if (s.mouseIsPressed === true) {
        s.line(s.mouseX, s.mouseY, s.pmouseX, s.pmouseY);
      }
    };
    s.keyPressed = () => {
    if (s.key === 'c') {
      window.location.reload();
    }};};
  };
  this.p5Init = new p5(doodleArea);
}
下面是相同的示例代码:


希望这会有所帮助。

您能更具体地说明此错误的行号吗。你能在开发工具中提供控制台错误的截图吗?嗨,我已经添加了截图!