如何在Incisor中点击按钮时向回调函数传入自定义数据?
如何在Incisor中点击按钮时向回调函数传入自定义数据?
嘿,我之前也碰到过类似的问题,来给你唠唠怎么解决!
你现在遇到的问题,核心是Incisor框架的回调参数规则:当你给按钮添加点击回调时,框架默认会把MouseEvent对象作为第一个参数传给回调函数,而你手动传入的自定义数据,会排在这个事件参数的后面。所以你的回调函数只写了一个参数data的话,拿到的自然就是先传过来的事件对象啦。
给你两个实用的解决办法,挑顺手的用就行:
方法一:调整回调参数顺序(最直接)
只需要修改你的回调函数,先接收事件参数,再接收自定义数据,就能拿到你要的data了:
init() { let data = {"id": 0, "email": "test@email.test", "active": true}; // 先定义回调函数,参数顺序改成 event 在前,data 在后 this.myPressCallback = function( event, data ) { console.log('callback:', data ); // 现在这里就能正确拿到自定义数据了 } this.button = new Button( nc.graphicAssets.WhiteBox, nc.mainScene, "MyButton" ); this.button.addPressCallback( this, "myPressCallback", data ); }
顺便提一句,建议把回调函数的定义放在addPressCallback调用之前——虽然Incisor用字符串方法名查找的方式可能不会出问题,但这样写逻辑更清晰,也能避免一些潜在的小坑。
方法二:用闭包包裹回调(不想处理事件参数时用)
如果你不想在回调里处理事件对象,可以用闭包把自定义数据“包”在回调里,直接拿到目标数据:
init() { let data = {"id": 0, "email": "test@email.test", "active": true}; this.button = new Button( nc.graphicAssets.WhiteBox, nc.mainScene, "MyButton" ); // 用箭头函数包裹,自动绑定当前的 this 和 data this.button.addPressCallback( this, (event) => { this.myPressCallback(data); }); this.myPressCallback = function( data ) { console.log('callback:', data ); } }
如果你的环境不支持箭头函数,也可以用普通函数加变量保存this:
const self = this; this.button.addPressCallback( this, function(event) { self.myPressCallback(data); });
这样调整之后,点击按钮时回调里就能正确获取到你传入的自定义数据啦!
备注:内容来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

