事件是为了解耦...
使用"on add"添加属性,注册事件 使用on方法注册事件. 第三个参数$data是监听函数使用的参数, 第四个$append参数设置为false则把改事件的方法给添加到最前面,会先触发 事件种类: 匿名函数:function($event){} 对象方法:[$object,"handleAdd"] 静态类方法:["Page","handleAdd"] 全局函数:"handleAdd"
namespace frontend\tests;
use yii\base\Component;
class EventTest extends Component{
}
$a = new EventTest();
$p = "on add";
$a->$p = function($event){
print "匿名函数";
}
function add($event){
print "全局函数";
}
$a->on("add", "add");
$a->trigger("add");
触发事件的时候,会传送一个$event对象给监听函数.该事件对象有sender.name.$handled和data以及$_events属性 sender 就是组件本身,事件的发送者 name 事件名称 handled 设置该属性可以阻止事件的继续触发..比如判断登录错误.验证一个事件时出现错误.把这个设置为true.就不会继续传播了 $_events 存储的数据是$_events[$name][$class] 事件名...类名..最后会根据类名再循环找到所有的父类的事件
$this->ensureBehaviors(); //确保自身behaviors()函数中的行为被添加
if (!empty($this->_events[$name])) {
if ($event === null) {
$event = new Event;
}
if ($event->sender === null) {
$event->sender = $this;
}
$event->handled = false;
$event->name = $name;
foreach ($this->_events[$name] as $handler) {
$event->data = $handler[1];
call_user_func($handler[0], $event);
// stop further handling if the event is handled
if ($event->handled) { //如果false则直接返回
return;
}
}
}
// invoke class-level attached handlers
Event::trigger($this, $name, $event);//执行事件本身的events,
注意最后一步,你可以为某个有继承关系的类自定义一个事件..这里会执行父类的事件
使用off移除事件.没什么好说的了
无论是事件还是行为,经常能够看到这个方法ensureBehaviors() 该方法确保该组件默认的behaviors()方法中的组件总是被加载的... 没弄明白,yii作者为什么这么写...放在构造函数中执行一次不是更好...
attachBehavior,attachBehaviors 这两个首先会执行ensureBehaviors()确保自身的行为一定会被加载..
原文地址:http://www.cnblogs.com/zhepama/p/3851842.html