• 学习yii2.0——事件


      参考:https://www.yiichina.com/doc/guide/2.0/concept-events

    事件

      yii框架中的事件定义和JavaScript中的事件定义差不多:为某个事件绑定一些操作,如果这个事件被触发,那么绑定的操作就会被执行。

      这里有两个概念:事件与事件处理程序

      事件,泛指某个操作,比如孩子饿哭了。而事件处理程序就是对应的操作,比如大人去煮饭。

      如果一个类需要绑定、触发、取消事件,都需要yiiaseComponent这个类的支持。

      

    事件处理程序

      yii框架中的事件处理程序可以是一下四种:

    • 字符串形式指定的 PHP 全局函数,如 'trim' ;
    • 对象名和方法名数组形式指定的对象方法,如 [$object, $method] ;
    • 类名和方法名数组形式指定的静态类方法,如 [$class, $method] ;
    • 匿名函数,如 function ($event) { ... } 。

      

    事件操作

      绑定事件

      yii框架中提供的绑定事件方法和jQuery中绑定事件的格式很相似: $obj->on(event,  event_handler)。

      其中,event是事件的名称,可以随意指定,需要注意的是,绑定事件的时候用的什么event名称,那么在解除事件或者触发事件的时候,也必须使用该名称才能出发该事件。

      触发事件

      在类中的方法内部使用$this->trigger(event),注意这个类必须继承yiiaseComponent类。

      取消事件

      使用$obj->off(event, event_handler)来取消事件。

    下面是一个完整的事件绑定、触发、取消的实例

    <?php
    namespace appcontrollers;
    
    use yiiwebController;
    use yiiaseComponent;
    use yiiaseEvent;
    
    //要绑定事件或者触发事件的类要继承yiiaseComponent
    class Child extends Component {
    	public function Cry()
    	{
    		echo "孩子哭了,因为肚子饿<br>";
    		//当这个方法被调用的时候,触发事件。cry事件可以随意制定。
    		$this->trigger("cry");
    	}
    }
    
    class Parents {
    	public function Cook() 
    	{
    		echo "先别哭,老子马上做饭<br>";
    	}
    
    	public static function Eat() 
    	{
    		echo "吃饭吧<br>";
    	}
    }
    
    class HelloController extends Controller {
    	public function actionOne()
    	{
    		$child1 = new Child();
    		$child2 = new Child();
    		$parents = new Parents();
    
    		//只为一个孩子绑定匿名函数作为事件处理程序
    		$child1->on("cry", function($e){
    			// print_r($e);  //打印触发的事件信息
    			echo "闭嘴</br>";
    		});
    
    		//绑定其他事件处理程序(对象方法)
    		// $child1->on("cry", [$parents, "Cook"]);
    		//绑定其他事件处理程序(静态类方法)
    		// $child1->on("cry", ["appcontrollersParents", "Eat"]);
    		//绑定其他事件处理程序(指定函数)
    		// $deal = function () {
    		// 	echo "shut up<br>";
    		// };
    		// $child1->on("cry", $deal);
    		// 取消事件
    		// $child1->off("cry", $deal);
    
    		$child1->Cry(); //会触发cry事件,并且会调用事件处理程序
    		$child2->Cry(); //会触发cry事件,但是并不会调用事件处理程序
    		//输出:
    		//孩子哭了,因为肚子饿
    		//闭嘴
    		//孩子哭了,因为肚子饿
    	}
    
    	public function actionTwo()
    	{
    		$child1 = new Child();
    		$child2 = new Child();
    		$parents = new Parents();
    
    		//为所有孩子绑定事件处理程序
    		//需要使用Event对象
    		Event::on(Child::className(), "cry", function($e){
    			// print_r($e);
    			echo "闭嘴<br>";
    		});
    		//使用这个方法同样可以绑定其他形式的事件处理程序格式。
    
    		//取消事件
    		// Event::off(Child::className(), "cry", "xxxx")
    
    		$child1->Cry();
    		$child2->Cry();
    		//上面两个Cry方法中触发的cry事件,对应的事件都会被调用:
    		// 孩子哭了,因为肚子饿
    		// 闭嘴
    		// 孩子哭了,因为肚子饿
    		// 闭嘴
    	}
    }
    

      

  • 相关阅读:
    解决png图像透明问题
    常用的CSS命名规则
    站点跨域登录
    SVN服务器配置
    开源方便的PHP & Flash图表:Open Flash Chart
    php+mysql无限级分类(非递归)
    地址栏显示图标 Shortcut Icon
    mysql set类型和enum类型
    通过 WebDAV 协议访问版本库(http://)
    年薪第一的数据库工程师是怎样炼成的
  • 原文地址:https://www.cnblogs.com/-beyond/p/9482394.html
Copyright © 2020-2023  润新知