2021-08-15 16:57:20 +08:00
# 事件绑定
在构件数据格式文件中可以用”binds“属性来为构件定义一到多个事件绑定。
事件绑定是一个数组结构的数据,每个事件绑定为当前构件(及其下属命名子构件)的任何一个事件定义处理实体
一个处理实体可以是
1. 一个构件的方法
2. 一个”urlwidget“类型的构件
3. 一个描述一个构件的构件数据
4. 一个注册函数
5. 一个python脚本
6. 某个构件的事件
7. 一个组合处理(可以是上述处理实体的组合数组)
## 名称约定
* self 当前构件
* root App.root构件
* “-”( 减号) 开始的名称, 从当前位置查找命名的祖先构件, 如果到app.root还没有找到, 则返回空
* app App.get_running_app
## 事件绑定数据格式说明
### wid
事件发生所在构件, 如果wid所代表的构件不存在指定的事件, 此事件绑定将作废,
必选项, self为当前构件
### event
事件名称, wid和event组合就可以唯一确定一个事件
### actiontype
行动类型, 分别是“blocks”、”urlwidget“、“registerfunction”, “script”、“method“、”event“和”multiple“之一。
* ”blocks“: 值必须是一个符合构件数据格式要求的字典数据, 用来创建一个构件。
* ”urlwidget“; 值必须是一个url, 从服务器下载一个构件数据格式的文件来创建构件
* ”Registerfunction“: 注册函数, 注册函数必须是def f(*args, **kwargs)参数格式, args[0] 为wid所代表的构件对象, 如果事件带数据, 则从args[1]开始。
* ”script“: python 脚本。在脚本中有两个内定变量可用: self为“target”指定的构件, args=[事件对象,s事件数据]
* ”method“: 构件的方法, 构件由此事件绑定的”target“属性指定, 此方法必须具有*args, **kwargs格式的参数定义方式
* ”event“: 构件的事件, 构件由此事件绑定的”target“属性指定, 事件绑定的参数将传递给此事件
* “multiple”: 组合绑定, 参看例子
### datatarget
指定数据获取的构件, 此构件需有“getValue”方法, 用来获取数据, 数据需是字典类型
### target
指定处理事件的构件, 对于actiontype in ["blocks", "urlwidget"]的事件绑定, target为其父构件, 缺省的插入方式为替代, 即用事件构造的构件, 替换所有target构件中的其他子构件, 成为target构件的唯一子构件, 可以在事件绑定定义了不等于”replace“的“mode“属性, 使得新创建的构件添加在其他构件的后面。
### mode
可选属性, 只有在actiontype in ["blocks", "urlwidget"]情况下有效, 指定事件创建的构件在target构件中的插入方式, mode==”replace“时, 清空target的所有子构件后插入, 否则添加到最后。
### params
事件处理指定的静态参数, 其值在构件创建时确定, 不会改变, 实际传递给事件处理的参数为params.update(d), 其中d为datatarget构件的getValue方法返回的结果。如果未定义datatarget, 则d={},
### options
可选项, 只有在actiontype in ["blocks", "urlwidget"]情况下有效, 指定创建构件的构件数据格式options的值需是一个数据字典, 且需满足构件数据格式要求。参看[构件数据格式](./cdf.md)
### conform
可选项,如果存在,此事件处理前需要客户点击弹出窗体中的确认键,否则将不会处理
conform的数据格式如下:
```
"conform":{
"size_hint":[0.6,0.6],
"title":"Conform for delete playlist",
"message":"Please conform to delete this play list"
}
```
其中
* size_hint定义弹出窗体占屏幕宽, 高的占比
* title是团出窗体的标题
* message是显示的内容
### rfname
当actiontype==‘ registedfunction’ 时有效, 指定注册函数, 在前端应用中需先注册, 使用以下代码注册一个registedfunction
```
from appPublic.registerfunction import RegisterFunction
def HelloRF(*args, **kwargs):
print('Hello ...')
rf = RegisterFunciton()
rf.register('testrf', HelloRF)
```
'testrf'即可用于rfname
### script
当actiontype=='script'时有效, 其值是一行可执行的python代码
### dispatch_event
当actiontype=='event'时有效, 指定需要触发target构件上的事件名称
## 例子
### urlwidget
```
{
"actiontype":"urlwidget",
"wid":"delete",
"datawidget":"delete",
"target":"root.public_popup",
"event":"on_press",
"conform":{
"size_hint":[0.6,0.6],
"title":"Conform for delete playlist",
"message":"Please conform to delete this play list"
},
"options":{
"method":"GET",
"mode":"replace",
"params":{{json.dumps(params_kw)}},
"url":"{{entire_url('delete_pldetail_song.dspy')}}"
}
},
```
命名构件”delete“按钮的”on_press"事件被绑定到了一个“urlwidget”事件处理上, 数据来源为“delete”构件, 目标窗体为app.root构件下面的一个”public_popup"的构件。此事件的处理需要用户在弹出窗体中点击确认键后才能处理。
### method
```
{
"event":"on_press",
"actiontype":"method",
"wid":"delete",
"target":"root.public_popup",
"method":"open"
}
```
命名构件“delete”的“on_press"事件调用app.root的public_popup构件的open函数来处理。
### registedfunction
```
{
"actiontype":"registedfunction",
"wid":"playlist_add",
"event":"on_submit",
"datawidget":"playlist_add",
"target":"self",
"rfname":"playlist_add"
}
```
"playlist_add"构件的"on_submit"事件绑定在一个registedfunction的处理函数上
事件的数据来源与“playlist_add"构件。
### script
```
{
"actiontype":"script",
"wid":"playlist_add",
"event":"on_submit",
"datawidget":"playlist_add",
"target":"self",
"script":"print(self, args)"
}
```
"playlist_add"构件的"on_submit"事件绑定了一个script的处理, 即打印出target和参数