POX控制器源码阅读(二) 组件如何监听事件/未完成
2018-03-23 17:53
375 查看
目前看到的三种监听
listenTo
addListeners
listen_to_dependencies
首先了解一下pox/lib/revent下EventMixin类中的autoBindEvents方法
autoBindEvents为组件与事件绑定函数def autoBindEvents (sink, source, prefix='', weak=False, priority=None):
if len(prefix) > 0 and prefix[0] != '_': prefix = '_' + prefix
if hasattr(source, '_eventMixin_events') is False:
# If source does not declare that it raises any events, do nothing
print("Warning: source class %s doesn't specify any events!" % (
source.__class__.__name__,))
return []
events = {}
for e in source._eventMixin_events:
if type(e) == str:
events[e] = e
else:
events[e.__name__] = e
listeners = []
# for each method in sink
for m in dir(sink):
# get the method object
a = getattr(sink, m)
if callable(a):
# if it has the revent prefix signature,
if m.startswith("_handle" + prefix + "_"):
event = m[8+len(prefix):]
# and it is one of the events our source triggers
if event in events:
# append the listener
listeners.append(source.addListener(events[event], a, weak=weak,
priority=priority))
#print("autoBind: ",source,m,"to",sink)
elif len(prefix) > 0 and "_" not in event:
print("Warning: %s found in %s, but %s not raised by %s" %
(m, sink.__class__.__name__, event,
source.__class__.__name__))
return listeners
我们来看一下autoBindEvents的功能
因为“sink”的对象常常会对一些其他source引发的事件感兴趣,因而autoBindEvents是用来为“source引发的事件”自动在“sink”中安装listener。
这需要你在sinl对象中对handler methods进行特殊的命名方法,比如当你有一个对象mySource用以产生多个事件,比如FooEvent和BarEvent,而你的mySink对象希望去监听这些事件,所以你必须要将你的handler method命名为如下方式:
"_handle_FooEvent","_handle_BarEvent",之后只要调用autoBindEvents(mySink, mySource)就可以完成handlers的安装。
该函数也提供了额外的命名方式,比如按这种方式调用:autoBindEvents(mySink, mySource, "source1")。就可以将handlers的名字改为"_handle_source1_FooEvent"。
分析代码:
if len(prefix) > 0 and prefix[0] != '_': prefix = '_' + prefix
该句判断event是否有前缀
events = {}用于保存source的事件
listeners = [] 用来保存事件处理函数handlers
for m in dir(sink):
a = getattr(sink, m)
if callable(a):
if m.startswith("_handle" + prefix + "_"):
event = m[8+len(prefix):]
if event in events:
listeners.append(source.addListener(events[event], a, weak=weak, priority=priority))
便利组件中的函数,如果存在_handle_开头的函数,取出其事件名,如果事件名对应,则将该处理函数存储在source中
listenTo
addListeners
listen_to_dependencies
首先了解一下pox/lib/revent下EventMixin类中的autoBindEvents方法
autoBindEvents为组件与事件绑定函数def autoBindEvents (sink, source, prefix='', weak=False, priority=None):
if len(prefix) > 0 and prefix[0] != '_': prefix = '_' + prefix
if hasattr(source, '_eventMixin_events') is False:
# If source does not declare that it raises any events, do nothing
print("Warning: source class %s doesn't specify any events!" % (
source.__class__.__name__,))
return []
events = {}
for e in source._eventMixin_events:
if type(e) == str:
events[e] = e
else:
events[e.__name__] = e
listeners = []
# for each method in sink
for m in dir(sink):
# get the method object
a = getattr(sink, m)
if callable(a):
# if it has the revent prefix signature,
if m.startswith("_handle" + prefix + "_"):
event = m[8+len(prefix):]
# and it is one of the events our source triggers
if event in events:
# append the listener
listeners.append(source.addListener(events[event], a, weak=weak,
priority=priority))
#print("autoBind: ",source,m,"to",sink)
elif len(prefix) > 0 and "_" not in event:
print("Warning: %s found in %s, but %s not raised by %s" %
(m, sink.__class__.__name__, event,
source.__class__.__name__))
return listeners
我们来看一下autoBindEvents的功能
因为“sink”的对象常常会对一些其他source引发的事件感兴趣,因而autoBindEvents是用来为“source引发的事件”自动在“sink”中安装listener。
这需要你在sinl对象中对handler methods进行特殊的命名方法,比如当你有一个对象mySource用以产生多个事件,比如FooEvent和BarEvent,而你的mySink对象希望去监听这些事件,所以你必须要将你的handler method命名为如下方式:
"_handle_FooEvent","_handle_BarEvent",之后只要调用autoBindEvents(mySink, mySource)就可以完成handlers的安装。
该函数也提供了额外的命名方式,比如按这种方式调用:autoBindEvents(mySink, mySource, "source1")。就可以将handlers的名字改为"_handle_source1_FooEvent"。
分析代码:
if len(prefix) > 0 and prefix[0] != '_': prefix = '_' + prefix
该句判断event是否有前缀
events = {}用于保存source的事件
listeners = [] 用来保存事件处理函数handlers
for m in dir(sink):
a = getattr(sink, m)
if callable(a):
if m.startswith("_handle" + prefix + "_"):
event = m[8+len(prefix):]
if event in events:
listeners.append(source.addListener(events[event], a, weak=weak, priority=priority))
便利组件中的函数,如果存在_handle_开头的函数,取出其事件名,如果事件名对应,则将该处理函数存储在source中
相关文章推荐
- POX控制器源码阅读(一) 组件如何注册
- 3 EventTime 事件时间类和TimeNow函数——Live555源码阅读(一)基本组件类
- POX控制器源码阅读
- highcharts图表组件入门教程:如何监听柱状图柱子点击事件动态更新当前数据点数值和所对应X轴刻度
- 如何监听Element组件<el-input>标签的回车事件
- 阅读layim代码小记,监听事件实现方法
- android主题Theme.NoTitleBar.Fullscreen下如何设置程序的字体颜色为黑色 分类: Android界面和组件 2014-06-21 14:04 162人阅读 评论(0) 收藏
- 如何阅读 Redis 源码?
- Android 如何监听输入法关闭事件
- Android 组件学习【启发】 如何处理好多个组件的多个事件 收藏
- js中如何添加一个事件监听addEventListener
- MAC下如何把android源码导入到eclipse中阅读查看
- Spring源码解析——如何阅读源码
- android 编程时,如何在Eclipse中查看Android源码或者第三方组件包源码
- 如何阅读Linux源码[转]
- 如何学习吉日嘎拉的走火入魔C#.NET通用权限管理系统组件源码?
- ndroid 上层应用如何监听 sdcard的插拔事件
- 如何在Eclipse中查看Android源码或者第三方组件包源码
- 如何监听fragment中的回退事件与怎样保存fragment状态
- Yii源码阅读笔记 - 日志组件