• 事件系统
    • 名词解释
    • 注册普通监听器
    • 注册通配符监听器
    • 触发事件
    • 触发单次事件
    • 返回处理结果
    • 监听器是否存在
    • 终止事件传递
    • 解除监听器

    事件系统

    事件机制是一种很好的应用解耦方式。CatLib事件系统让我们可以订阅和监听程序中出现的各种事件。事件系统结合服务容器,将提供更加优秀的事件处理方式。

    CatLib核心已经默认提供了事件系统,供给全局事件使用。如果您要定义私有范围的事件可以这么做:

    1. var dispatcher = new Dispatcher(); // 构建一个单纯的事件调度器

    名词解释

    • 载荷是指程序调用所附带的上下文信息。不同的调用者所提供的上下文信息各不相同。

    注册普通监听器

    通过 App.On 命令您可以注册一个事件的监听器,监听器函数会通过服务容器调用,自动解析并且注入合适的参数。

    1. App.On("event.name" , (IApplication application)=>{
    2. //todo
    3. });

    除了通过lambda注册外事件监听器还能够通过对象方法注册,一共接收3个参数,第一个参数为事件名,第二个参数为触发事件后调用的对象,第三个参数为触发事件后调用对象的函数名(可选项),如果您没有传入第三个参数作为函数名,CatLib事件系统会通过字符串方法分析事件名给定一个函数名,这一特性在有完整的事件名规范时将会大大简化代码。

    1. App.On("MyEvent.CallEvent" , cls); // 分析得出的函数名 : CallEvent

    注册通配符监听器

    CatLib事件系统允许使用通配符*对事件进行匹配。它让你在一个监听器中可以监听到多个事件。

    注意:通配符事件每次事件调用都会被依次检查,您应该控制他们在项目中的数量。

    1. App.On("event.*" , ()=>{
    2. //todo
    3. });
    4. // event.catlib
    5. // event.catlib.version

    触发事件

    如果要触发事件,您可以通过App.Trigger来触发事件。这个函数将会把事件分发到它所有已经注册的监听器上。因为 App 是全局可访问的,所以你可以在项目中的任何地方调用它, CatLib的将使用容器来调度到方法,这意味这您可以直接展开传入的参数。

    1. App.Trigger("event.name", /*Your params*/);

    触发单次事件

    通过TriggerHalt您可以限定这次事件的触发只要监听器返回了有效处理结果(不为null)那么就自动终止事件传递。

    1. App.TriggerHalt("event");

    返回处理结果

    您可以通过return一个对象,这个对象将会被返回给调用者。

    1. App.Listen("event" , ()=>{
    2. return "call complete";
    3. });
    4. App.Listen("event.*" , ()=>{
    5. return "call all";
    6. });
    7. App.TriggerHalt("event"); // call complete
    8. App.Trigger("event.name"); // object[]{ "call complete" , "call all" }

    监听器是否存在

    您可以通过HasListeners来判断事件监听器是否存在,该方法接收两个参数,第一个参数为事件名,第二个参数为是否进行严格匹配(可选), 如果进行严格匹配那么将禁用通配符匹配。

    1. App.Listen("event.*" , ()=>{
    2. return "call complete";
    3. });
    4. App.HasListeners("event.name", false); // true
    5. App.HasListeners("event.name", true); // false
    6. App.HasListeners("event.*", true); // true

    终止事件传递

    CatLib事件系统支持返回一个false来终止事件的传递。

    1. App.Listen("event" , ()=>{
    2. return false;
    3. });

    解除监听器

    您可以通过Off方法来解除事件监听器,该方法支持三种解除方式:

    • 如果传入的是字符串(string)将会解除对应事件名的所有事件
    • 如果传入的是事件对象(IEvent)那么解除对应事件
    • 如果传入的是其他实例(object)会解除该实例下的所有事件
    1. var handler = App.On("event.*" , (payload)=>{
    2. //todo
    3. });
    4. App.Off(handler);