Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 在A-Frame中动态创建的上添加事件侦听器_Typescript_Event Handling_Aframe - Fatal编程技术网

Typescript 在A-Frame中动态创建的上添加事件侦听器

Typescript 在A-Frame中动态创建的上添加事件侦听器,typescript,event-handling,aframe,Typescript,Event Handling,Aframe,我创建了一个类,它可以帮助我使用a-Frame显示3D模型。在这个类中,有一些在运行时创建的球体被插入到场景中。我正在尝试添加一个事件侦听器(单击这些球体时,我必须显示一条消息) 代码如下: 导出类AFrameObjViewNavMarkProvider实现提供程序{ //类变量。。。 //构造器。。。 //-----方法------\\ 公共设置指针服务(指针服务:指针服务){ //方法代码。。。 } 公共设置点触发器(值:布尔值){ //方法代码。。。 } //-----处理程序------

我创建了一个类,它可以帮助我使用a-Frame显示3D模型。在这个类中,有一些在运行时创建的球体被插入到场景中。我正在尝试添加一个事件侦听器(单击这些球体时,我必须显示一条消息)

代码如下:

导出类AFrameObjViewNavMarkProvider实现提供程序{
//类变量。。。
//构造器。。。
//-----方法------\\
公共设置指针服务(指针服务:指针服务){
//方法代码。。。
}
公共设置点触发器(值:布尔值){
//方法代码。。。
}
//-----处理程序------\\
//单击处理程序
clickHandler(事件,模型:模型){
//保存到后端的代码。。。
//将指针保存到后端
this.pointersService.loadPointer(newPointer).subscribe((指针)=>{
this.showPointer(指针);
});
}
showPointer(指针:指针){
//创建包含位置的字符串
设pointString=pointer.position[0]。toFixed(3)+“”
+指针。位置[1]。固定(3)+“”
+指针.position[2].toFixed(3);
//计算包含模型的框
设modelRef=

第一次尝试:我尝试注册另一个组件,如下所示:

AFRAME.registerComponent('pointer-handler'{
init:function(){
this.el.addEventListener('click',()=>{
log(“单击指针”);
});
}
});
并在
showPointer
方法中使用
setAttribute(“指针处理程序”)

第二次尝试:我尝试使用
标记将事件侦听器直接添加到
showPointer
方法中

第三次尝试:第三次尝试可以在代码上找到,进入
setTimeout
的回调

每次尝试都不起作用;如果我尝试单击一个球体,则什么也不会发生。但是,如果我打开A-Frame inspector,导航到其中一个球体并单击它,则会记录消息。我怀疑添加了处理程序,但某种原因导致未检测到单击

我们将感谢您的每一个建议

谢谢


编辑:您可以使用
setAttribute(“指针处理程序”)
方法找到回购

方法绝对有效,是实现您想要实现的目标的正确方法

我认为可能是
单击
事件导致了问题。我建议您将其替换为
mouseup
mousedown
事件

还要确保你确实可以触发事件-你需要一个光标连接到你的相机上

工作示例 全屏运行(运行代码片段后的右上角查看整个场景-关闭也在右上角)

您可以通过按左上角的按钮来添加新元素。查看单击有时是如何触发的,有时根本不触发

让boxCounter=0;
函数createNewElement(){
let-box=document.createElement(“a-box”);
boxCounter++;
setAttribute(“位置“,”+boxCounter+“0-2”);
框。设置属性(“比例”,“0.5”);
框。设置属性(“颜色”、“红色”);
setAttribute(“单击处理程序”,”);
document.getElementById(“场景”).appendChild(框);
}

注册表组件('click-handler'{
init:function(){
this.el.addEventListener('mousedown',(事件)=>{
log(“我被鼠标移走了!”);
this.el.setAttribute('material','color','green');
});
this.el.addEventListener('mouseup',(事件)=>{
log(“我被老鼠咬了!”);
this.el.setAttribute('material'、'color'、'red');
});
this.el.addEventListener('单击',(事件)=>{
log(“我被点击了!”);
这个.el.setAttribute('scale','0.50.50.5');
});
}
});

在运行时附加事件侦听器应该可以工作。我建议共享人们可以运行、调试和建议替代方案的代码。Glitch是一个很好的选择。它将使人们更容易帮助您。我还建议将您的代码提取到说明问题所需的最低限度。目前存在大量不相关的上下文这将使人们更难调查。luckHi最棒。我计划创建一个故障项目并将其添加到问题中(我必须隔离代码,因为它是更大项目的一部分)。每次尝试添加事件侦听器(使用检查器,我都可以看到侦听器在那里)但当我单击时,什么也不会发生。这是一种优雅的方式。我将其用作参考,并制作了一个有效的东西。在我以前的尝试中,没有检测到单击,因为我没有在球体上添加
可单击的
类。