为了账号安全,请及时绑定邮箱和手机立即绑定

与角度一起使用时,p5.js 中的变量未定义?

与角度一起使用时,p5.js 中的变量未定义?

郎朗坤 2022-06-05 11:02:41
我正在学习 WebGL,并开始使用 p5.js 和 angular 开发 Sketch 应用程序。我在组件文件中定义了布尔变量,因此我想在绘图函数中触发特定函数,如椭圆、矩形、直线等。这些布尔变量由另一个组件中的按钮管理。我收到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;          }        }      });  }}控制台截图:
查看完整描述

1 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

这是因为范围的问题。在回调函数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);

}

以下是相同的示例代码:


https://stackblitz.com/edit/angular-s-p5-angular?file=src%2Fapp%2Fapp.component.ts


https://angular-s-p5-angular.stackblitz.io


希望这会有所帮助。


查看完整回答
反对 回复 2022-06-05
  • 1 回答
  • 0 关注
  • 178 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号