function product_tool_event_handler(obj) obj获取data

本文介绍了一种使用JavaScript处理客户数据表格的方法,详细解释了如何通过点击事件选择特定客户信息并将其应用于表单字段的过程。同时,纠正了关于事件处理器参数obj的常见误解,明确了其实际包含的数据内容。
	elem: '#customer_result'
	,url: context_path + '/api/customer'
	,method : 'get'										
	,response : {										
		statusName : 'code'									
		,statusCode : 200
		,msgName : 'msg'									
		,countName : 'count'								
		,dataName : 'data'
	}
	,title : '客户列表'										
	,cols : [ [ 
		{ field : 'custId', title : '客户编号', width : 100}
		,{ field : 'custName', title : '客户姓名', width : 150 }
		,{ field : 'custEmail', title : '邮箱', width : 150 }
		,{ fixed : 'right', title : '操作', toolbar : '#hidden1-table-tool', width : 80 } ] ]
};

/**
 * 点击弹出的“客户信息”弹层上的表格中“选中”按钮的触发函数
 */
function customer_tool_event_handler(obj) {
	
	console.info(obj);
	var data = obj.data;
	switch (obj.event) {
		case 'select':
			$('#custName').val(data.custName);
			$('#custId').val(data.custId);
			layer.close(layer.index);
				break;
	}
}

错误认识:
customer_tool_event_handler(obj)中obj可以拿到下面数据,这是一个超级错误的认识

	elem: '#customer_result'
	,url: context_path + '/api/customer'
	,method : 'get'										
	,response : {										
		statusName : 'code'									
		,statusCode : 200![在这里插入图片描述](https://img-blog.csdnimg.cn/20181130170659370.png)
		,msgName : 'msg'									
		,countName : 'count'								
		,dataName : 'data'
	}
	,title : '客户列表'										
	,cols : [ [ 
		{ field : 'custId', title : '客户编号', width : 100}
		,{ field : 'custName', title : '客户姓名', width : 150 }
		,{ field : 'custEmail', title : '邮箱', width : 150 }
		,{ fixed : 'right', title : '操作', toolbar : '#hidden1-table-tool', width : 80 } ] ]
	};

下面看一下真正的obj对象中的数据简图有哪些
在这里插入图片描述
在这里插入图片描述

还有一个错误

console.info("=============="+obj);

如果我们在前面添加了一个字符串,那么打印出来的就是
"=============="Object object,不会有上面的内容出现

<think>我们正在讨论LVGL中的事件回调函数lv_obj_add_event_cb,特别是如何获取与对象关联的user_data。 根据引用[2]和引用[3],我们知道lv_obj_add_event_cb函数有一个参数user_data,用于传递用户自定义数据。 在事件回调函数中,如何获取这个user_data呢? 在LVGL的事件回调函数中,事件对象(lv_event_t)会传递给回调函数。这个事件对象包含了user_data。 具体来说,我们可以使用lv_event_get_user_data(event)函数来获取在添加事件回调时传入的user_data。 此外,引用[2]提到,通过user_data传递参数可以避免为每个事件都写一个单独的服务函数,这样同一个回调函数可以通过不同的user_data来区分不同的上下文。 下面是一个示例代码,展示如何添加事件回调并获取user_data: 假设我们有一个按钮对象,我们希望在点击按钮时获取到我们传递的user_data。 步骤: 1. 创建一个按钮对象。 2. 定义一个事件回调函数,在函数内部使用lv_event_get_user_data获取user_data。 3. 使用lv_obj_add_event_cb添加事件回调,并传递user_data。 示例代码: */ #include "lvgl.h" // 事件回调函数 static void my_event_cb(lv_event_t * e) { // 获取事件类型 lv_event_code_t code = lv_event_get_code(e); // 如果是点击事件(LV_EVENT_CLICKED) if(code == LV_EVENT_CLICKED) { // 从事件中获取user_data void * user_data = lv_event_get_user_data(e); // 假设我们传递的是一个字符串 const char * msg = (const char *)user_data; LV_LOG_USER("Button clicked: %s", msg); } } void create_button_with_event(lv_obj_t * parent) { // 创建一个按钮 lv_obj_t * btn = lv_btn_create(parent); lv_obj_center(btn); // 为按钮添加一个标签 lv_obj_t * label = lv_label_create(btn); lv_label_set_text(label, "Click me!"); lv_obj_center(label); // 定义一个字符串作为user_data传递 const char * my_data = "Hello, user_data!"; // 添加事件回调,监听点击事件,并传递my_data作为user_data lv_obj_add_event_cb(btn, my_event_cb, LV_EVENT_CLICKED, (void *)my_data); } /* 在这个例子中,当按钮被点击时,事件回调函数my_event_cb会被调用,然后通过lv_event_get_user_data(e)获取到我们传递的字符串"Hello, user_data!",并打印出来。 注意:user_data可以是任意类型的指针(void*),因此你可以传递一个结构体指针,这样就能传递多个数据。 另外,引用[3]中还提到lv_obj_get_user_data()函数,这个函数是直接获取对象(obj)的user_data,而不是事件回调中传递的user_data。这两者是有区别的: - lv_obj_set_user_data()和lv_obj_get_user_data()操作的是对象内部存储的一个用户数据字段(每个对象都有一个这样的字段)。 - 而lv_event_get_user_data()获取的是在添加事件回调时传递的user_data,这个user_data是特定于这个事件回调的。 因此,如果你在添加事件回调时传递了user_data,那么在事件回调函数中应该使用lv_event_get_user_data获取,而不是lv_obj_get_user_data。 总结: 在事件回调函数中获取user_data的步骤: 1. 在事件回调函数中,使用lv_event_get_user_data(e)函数,其中e是事件对象。 2. 将返回的void*指针转换为实际的数据类型。 这样,你就可以在事件回调中使用之前传递的自定义数据了。 */</think>在 LVGL 中,通过 `lv_obj_add_event_cb()` 添加事件回调时,您可以在回调函数中使用 `lv_event_get_user_data()` 获取关联的 `user_data`。以下是具体实现方法: ### 操作步骤 1. **添加事件回调** 调用 `lv_obj_add_event_cb()` 时传入自定义数据: ```c // 定义自定义数据结构 typedef struct { int id; const char* name; } CustomData; // 创建对象并添加事件 lv_obj_t* btn = lv_btn_create(lv_scr_act()); CustomData my_data = { .id = 1, .name = "Button1" }; // 传递 my_data 作为 user_data lv_obj_add_event_cb(btn, event_handler, LV_EVENT_CLICKED, &my_data); ``` 2. **在回调函数中获取数据** 通过 `lv_event_get_user_data()` 提取数据: ```c void event_handler(lv_event_t* e) { // 获取事件类型 (如 LV_EVENT_CLICKED) lv_event_code_t code = lv_event_get_code(e); // 提取关联的 user_data CustomData* data = (CustomData*)lv_event_get_user_data(e); // 使用数据 printf("Clicked: ID=%d, Name=%s\n", data->id, data->name); } ``` ### 关键说明 - **数据生命周期** 需确保 `user_data` 指向的数据在回调触发时**仍然有效**(例如使用全局/静态变量,或动态分配内存)。 - **多事件复用** 同一回调函数可通过不同 `user_data` 区分多个对象[^2]: ```c // 为不同按钮绑定同一回调但不同数据 lv_obj_add_event_cb(btn1, event_handler, LV_EVENT_CLICKED, &data1); lv_obj_add_event_cb(btn2, event_handler, LV_EVENT_CLICKED, &data2); ``` - **与对象自身数据的区别** `lv_obj_get_user_data(obj)` 获取的是对象创建时设置的通用数据(通过 `lv_obj_set_user_data()`),而非事件回调的 `user_data`[^3]。 ### 完整示例 ```c #include "lvgl.h" typedef struct { int counter; } ButtonData; void btn_event_cb(lv_event_t* e) { lv_event_code_t code = lv_event_get_code(e); if (code == LV_EVENT_CLICKED) { ButtonData* data = (ButtonData*)lv_event_get_user_data(e); data->counter++; LV_LOG_USER("点击次数: %d", data->counter); } } void create_button() { lv_obj_t* btn = lv_btn_create(lv_scr_act()); lv_obj_center(btn); // 为按钮分配自定义数据 ButtonData* btn_data = malloc(sizeof(ButtonData)); btn_data->counter = 0; lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_ALL, btn_data); // 对象删除时释放数据 (防止内存泄漏) lv_obj_add_event_cb(btn, [](lv_event_t* e) { free(lv_event_get_user_data(e)); }, LV_EVENT_DELETE, NULL); } ``` ### 注意事项 1. **内存管理** 动态分配的 `user_data` 需在对象删除事件 (`LV_EVENT_DELETE`) 中释放[^3]。 2. **线程安全** 在 RTOS 环境中,确保数据访问的原子性。 3. **数据一致性** 避免在回调外修改 `user_data` 时引发竞态条件。 --- ### 相关问题 1. 如何在 LVGL 中为不同事件类型绑定同一个回调函数? 2. `lv_obj_set_user_data()` 和事件回调的 `user_data` 有何区别?[^3] 3. 如何安全地在多线程环境中使用 LVGL 的事件回调? 4. 动态分配的 `user_data` 应该在何时释放以避免内存泄漏? [^1]: `lv_obj_add_event_cb()` 允许传递自定义数据到事件回调函数 [^2]: 通过 `user_data` 可实现单回调函数处理多对象事件 [^3]: 对象自身数据 (`lv_obj_set_user_data()`) 与事件回调数据是独立存储的 [^4]: LVGL 采用面向对象设计,事件系统是对象行为扩展的关键机制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值