如何将PHP变量传递给A-Frame点击事件函数并获取点击实体ID
问题背景
我是A-Frame开发初学者,需要实现将PHP变量传递到A-Frame点击事件中的功能。常规2D JavaScript开发中,直接写onclick=myFunction('{{ $myVariable }}')就能完成同类传参,但我没找到A-Frame场景下的对应实现示例。
我使用Blade模板循环渲染实体的HTML代码如下:
@foreach($files as $file) <a-entity id="gif-display1"> <a-entity position="2 0 -7" mixin="edit" id="edit_{{$file->id}}"></a-entity> <a-entity position="-2 0 -7" mixin="delete" id=="delete_{{$file->id}}"></a-entity> </a-entity foo> @endforeach
我目前写的组件注册代码如下,不知道init方法里要加什么逻辑才能拿到被点击实体的ID,以及对应绑定的PHP变量值:
AFRAME.registerComponent('foo' { init:function(){ // 需要在这里实现逻辑,获取被点击实体的ID })
实现方案
注意:你的原代码存在几处语法错误:foo组件写在了父实体的闭合标签上、delete按钮id属性多写了一个等号、JS组件注册时参数和闭合括号缺失,以下示例已经修正这些问题。
整体实现分两步即可:
- 第一步:调整Blade模板代码,给可点击实体添加点击识别标识,同时直接把PHP变量存在实体自定义属性上,比后续解析ID更稳妥。
调整后的模板代码:
这里给可点击实体加<!-- 确保场景相机下已经挂载<a-cursor></a-cursor>,否则点击事件不会触发 --> @foreach($files as $file) <a-entity id="gif-display1" foo> <a-entity position="2 0 -7" mixin="edit" class="cursor-listener" id="edit_{{$file->id}}" data-file-id="{{$file->id}}" data-action="edit" ></a-entity> <a-entity position="-2 0 -7" mixin="delete" class="cursor-listener" id="delete_{{$file->id}}" data-file-id="{{$file->id}}" data-action="delete" ></a-entity> </a-entity> @endforeachcursor-listener类是为了让A-Frame默认的光标射线能检测到实体,把foo组件绑定在父实体上可以避免给每个子实体重复注册组件,性能更好。 - 第二步:完善foo组件的init逻辑,绑定点击事件,从事件对象中获取被点击的实体,再读取实体上存储的属性值:
AFRAME.registerComponent('foo', { init: function(){ // 给当前组件绑定的父实体绑定点击事件监听 this.el.addEventListener('click', (e) => { // e.target就是实际被点击的子实体 const clickedEl = e.target; // 获取实体ID const elId = clickedEl.getAttribute('id'); // 获取之前存在自定义属性上的PHP变量值 const fileId = clickedEl.getAttribute('data-file-id'); const action = clickedEl.getAttribute('data-action'); // 后续直接根据拿到的值写业务逻辑即可 console.log('点击实体ID:', elId, '关联文件ID:', fileId, '操作类型:', action); if(action === 'edit') { // 编写编辑对应fileId文件的逻辑 } if(action === 'delete') { // 编写删除对应fileId文件的逻辑 } }) } })
补充说明:如果你不想加自定义data属性,也可以在拿到实体ID后通过字符串分割提取ID值,比如拿到
edit_123后用split('_')[1]就能拿到文件ID123,但自定义属性的写法容错率更高,后续迭代逻辑也更方便。
内容的提问来源于stack exchange,提问作者魏維德
相关产品推荐
相关产品推荐

