私コンポーネントのイベントハンドラでは、私はthis
を経由してコンポーネントのproperyを変更する必要があります角度2のイベントハンドラで 'this'にアクセスするには?
canvasKeyHandler (event) {
console.log('vrscene.canvasKeyHandler: event.keyCode=' + event.keyCode);
console.log('vrscene.canvasKeyHandler: self.dolly' + this.dolly);
CameraKeypressEvents.keyHandler(event, this.dolly) // <-- do something with this.dolly
しかしthis.dolly
はundefined
に設定されています:
vrscene.canvasKeyHandler: self.dollyundefined
vrscene.html:
vrscene.ts:
import {Component} from 'angular2/core';
import {Injectable} from 'angular2/core';
import WebGLRenderer = THREE.WebGLRenderer;
import {VRRenderer} from '../vrrenderer/vrrenderer'
import {CameraKeypressEvents} from '../camera-keypress-events/camera-keypress-events'
import Object3D = THREE.Object3D;
import Scene = THREE.Scene;
import PerspectiveCamera = THREE.PerspectiveCamera;
import Mesh = THREE.Mesh;
import VRControls = THREE.VRControls;
import VREffect = THREE.VREffect;
@Component ({
selector: 'vrscene',
templateUrl: 'app//vrscene/vrscene.html',
})
@Injectable()
export class VRScene {
private _scene: Scene;
camera: PerspectiveCamera;
dolly: Object3D;
vrControls: VRControls;
vrEffect: VREffect;
webVrManager;
sphere: Mesh;
cube: Mesh;
BaseRotation = new THREE.Quaternion();
constructor() {}
//initScene(width: number, height: number, renderer: VRRenderer) {
init(width: number, height: number, vrRenderer: VRRenderer) {
console.log('VRScene.init: entered')
this.scene = new THREE.Scene;
this.camera = new THREE.PerspectiveCamera(75, width/height);
this.camera.position.set(0, 1.5, 100);
this.dolly = new THREE.Object3D();
this.dolly.position.z = 50;
this.scene.add(this.dolly);
//
this.dolly.add(this.camera);
this.vrControls = new THREE.VRControls(this.camera);
this.vrEffect = new THREE.VREffect(vrRenderer.renderer);
this.vrEffect.setSize(width, height);
this.webVrManager = new (<any>window).WebVRManager(vrRenderer.renderer, this.vrEffect);
console.log('VRScene.init: this.webVrManager=' + this.webVrManager);
this.camera.quaternion.copy(this.BaseRotation);
var geometry = new THREE.BoxGeometry(25, 25, 25);
var meshParms = new Object();
meshParms['color'] = 0xff8000;
var material = new THREE.MeshBasicMaterial(meshParms);
//material = new THREE.MeshBasicMaterial({color: 0xffff00, side: THREE.DoubleSide});
this.cube = new THREE.Mesh(geometry, material);
this.scene.add(this.cube);
// draw!
vrRenderer.canvas.focus();
//CubeOnPlaneScene.prototype.mainLoop.bind(this)
// bind the 'this' of the canvasKeyHandler to the definition-time 'this'
//VRScene.prototype.canvasKeyHandler.bind(this)
}
canvasKeyHandler (event, dolly) {
console.log('vrscene.canvasKeyHandler: event.keyCode=' + event.keyCode);
//console.log('vrscene.canvasKeyHandler: this.dolly' + this.dolly);
//console.log('vrscene.
canvasKeyHandler: self.dolly' + this.dolly);
console.log('vrscene.canvasKeyHandler: dolly' + dolly);
//CameraKeypressEvents.keyHandler(event, this.dolly)
//CameraKeypressEvents.keyHandler(event, VRScene.prototype.canvasKeyHandler)
CameraKeypressEvents.keyHandler(event, dolly)
}
doIt() : string {
return 'hello from VRScene'
}
// getters and setters
get scene():Scene {
return this._scene;
}
set scene(scene: Scene) {
if (scene === undefined) throw 'Please supply a scene';
this._scene = scene;
}
}
キーハンドラ:
import {Directive} from 'angular2/core';
import {CubeScene} from '../cube-scene/cube-scene';
import Object3D = THREE.Object3D;
import Vector3 = THREE.Vector3;
import {Base} from '../base/base';
import Quaternion = THREE.Quaternion;
@Directive({
selector: '[camera-keypress-events]',
providers: [],
//host: {},
host: {
'(keypress)' : 'onKeypress($event)'
},
})
export class CameraKeypressEvents {
constructor() {}
static CAMERA_MOVE_DELTA = 1.2;
static CAMERA_ROT_DELTA = 5;
static keyHandler (event, dolly: Object3D) {
console.log('CameraKeypressEvents.keyHandler: event.keyCode=' + event.keyCode)
console.log('CameraKeypressEvents.keyHandler: dolly=' + dolly)
switch(event.keyCode) {
case 'S'.charCodeAt(0):
console.log('you pressed s');
//dolly.position.z += CAMERA_MOVE_DELTA;
dolly.translateZ(this.CAMERA_MOVE_DELTA);
console.log('dolly.postion.x=' + dolly.position.x);
break;
case 'W'.charCodeAt(0):
//console.log('you pressed s');
//this.dolly.position.z -= this.CAMERA_MOVE_DELTA;
dolly.translateZ(-this.CAMERA_MOVE_DELTA);
//console.log('this.do-ly.postion.x=' + this.dolly.position.x);
break;
case 'A'.charCodeAt(0):
//this.dolly.position.x -= this.CAMERA_MOVE_DELTA;
dolly.translateX(-this.CAMERA_MOVE_DELTA);
break;
case 'D'.charCodeAt(0):
//console.log('you pressed s');
//this.dolly.position.x += this.CAMERA_MOVE_DELTA;
dolly.translateX(this.CAMERA_MOVE_DELTA);
//console.log('this.dolly.postion.x=' + this.dolly.position.x);
break;
case 'N'.charCodeAt(0):
//this.dolly.position.y -= this.CAMERA_MOVE_DELTA;
dolly.translateY(-this.CAMERA_MOVE_DELTA);
break;
case 'P'.charCodeAt(0):
//console.log('you pressed s');
//this.dolly.position.y += this.CAMERA_MOVE_DELTA;
//console.log('this.dolly.postion.x=' + this.dolly.position.x);
dolly.translateY(this.CAMERA_MOVE_DELTA);
break;
case 'Q'.charCodeAt(0):
var tmpQuat = (new THREE.Quaternion()).setFromAxisAngle(new THREE.Vector3(0,1,0), Base.ONE_DEG * this.CAMERA_ROT_DELTA);
dolly.quaternion.multiply(tmpQuat);
break;
case 'E'.charCodeAt(0):
var tmpQuat = (new THREE.Quaternion()).setFromAxisAngle(new THREE.Vector3(0,1,0), Base.ONE_DEG * -this.CAMERA_ROT_DELTA);
dolly.quaternion.multiply(tmpQuat);
break;
};
}
onKeypress (event, cubeScene) {
console.log('CameraKeypressEvents.onKeypress: event.keyCode=' + event.keyCode)
//event.preventDefault();
console.log('vtClass.canvasKeyhandler: cubeScene=' + cubeScene);
console.log(event, event.keyCode, event.keyIdentifier);
/*
*/
}
}
どのように私はどちらかん:
A)はkeyhandler呼び出しでインスタンスを渡しますか?
私が試した:
(keydown)="canvasKeyHandler($event,{{dolly}})"
B)コンパイル時this
にcanvasKeyHandler
方法をバインド?
私が試した:
// bind the callback 'this' of the canvasKeyHandler to the definition-time 'this'
VRScene.prototype.canvasKeyHandler.bind(this)
と
canvasKeyHandler (event) {
...
}.bind(this)
を私の謝罪これは明白な質問ですが、私はちょうど角2フレームワークを学習し、この時点では少し圧倒取得しています。 @Inputで何かする必要がありますか?
多くのおかげ
コンポーネントの完全なコードを提供できますか?ありがとう! –
私はすべてのコンポーネントコードを渡しました。プロジェクトコード全体を参照する必要がある場合は、そのことについてのプレナーを行う必要があります。 – vt5491
VRSceneコンポーネントから '@Injectable()'を削除します( '@ Injectable'は依存関係を持つサービスにのみ必要です)。 「コードの壁」を掲示することは、StackOverflow上であなたに対してしばしば働きます。人々はあなたを助けることができる人であろうと、同様の問題を抱えている将来の読者であろうと、それを読む時間をとることはしばしばありません。問題を示す**最小**プランナーを作成します。たとえば、これらのケースステートメントをすべて削除します。問題を実証する必要がある場合は、1つだけを表示します。おそらくすべてを貼り付けるほうが簡単かもしれませんが、私が言ったように、あなたは助けを得ることはありません。 –