Угловая ошибка времени выполнения при вызове функции внутри цикла render (): 'undefined не является объектом (оценка this.watchlocation)'

Я создаю собственное приложение Angular с использованием ionic, используя three.js, и я не могу вызывать какие-либо функции внутри цикла рендеринга. Я пробовал использовать разные формы для функции watchLocation, такие как включение ее в метод init3D, но полный метод watchLocation () использует собственные плагины ionic, которые не работают, если я объявляю функцию внутри функции, которая ее вызывает.

Я рассмотрел все другие вопросы о переполнении стека, но эти методы не работали для этого приложения. Я думаю, что проблема в создании метода watchLocation или в вызове другой функции в цикле рендеринга приложения three.js.

Вот код (с изменениями, предложенными @UncleDave):

import {Component, Input, Renderer} from '@angular/core';
import {STLLoader} from "./stlloader";

import {
  Object3D,
  PerspectiveCamera,
  Scene,
  Mesh,
  WebGLRenderer,
  Vector3,
  SpotLight,
  MeshPhongMaterial,
  Color,
} from "three"
import { NavController } from 'ionic-angular';

@Component({
 selector: 'three-d',
 templateUrl: 'three-d.html'
 })

export class ThreeDComponent {

  _stlURL: string;

  @Input()
  set stlURL(url: string) {
  this._stlURL = url;
  this.init3D();
 }

  constructor() {
  console.log("threee-3d");
  }

  ionViewDidLoad(){
    this.init3D();
  }
  init3D() {

    // create a scene, that will hold all our elements such as objects, cameras and lights.
    ...
    let x=[0]; 
    let y=[0];
    let z=[0];
    render();


    function render() {
      // stats.update();
      this.Location(x,y,z);
      if (group) {
        group.position.x+=x[x.length-1];
        group.position.y+=y[y.length-1];
        group.position.z+=z[z.length-1];
      }

      // render using requestAnimationFrame
      requestAnimationFrame(render);
      webGLRenderer.render(scene, camera);
    }

  }
 Location(_x,_y,_z) {
   alert("hi");
   _x.push(0.01);
   _y.push(0.01);
   _z.push(0.01);
  }
 }
1
0
99
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проблема находится в нижней части init3D():

render();
let x=[0]; 
let y=[0];
let z=[0];

render() передает переменные x, y и z в watchLocation(_x,_y,_z), но они не определены, поскольку являются единственными переменными, которые могут вызвать сообщение об ошибке.

Проблема в том, что вы вызываете renderПЕРЕД, присваивая значение x, y и z.

Перемещение вызова рендеринга вниз должно решить вашу проблему:

let x=[0]; 
let y=[0];
let z=[0];
render();

спасибо за помощь, теперь я изменил это, но ошибка все еще не исчезла, и это все та же ошибка undefined is not an object (оценка this.watchLocation)

meeta 11.08.2018 11:37
Ответ принят как подходящий

Ошибка заключалась в способе вызова 'render', поскольку в него должно быть передано определение 'this'.

Изменять

render();

к

render(this); 

и изменить

requestAnimationFrame(render); 

к

requestAnimationFrame(function(){render(scope);});

Другие вопросы по теме