写在前面
本文仅仅是记录做法,想了解原理的还是请查看其他文章吧!
实现
/**
* 需要关心的消息
*/
public get careMessages(): string[]
{
return [];
}
/**
* 接收到消息时的处理函数
*/
public updateData(type: string): void
{
switch(type)
{
}
}
因为ModelMessageCareComponent已经默认注册了消息观察者,在子类进行初始化的时候,会对careMessages的消息进行注册
model类里面也实现了数据通知的接口,数据改变时,手动调用updateModel进行消息通知
此时ModelMessageCareComponent就会对已注册的信息进行比对,符合的话就会触发updateData回调
举例说明:金币变更 先在ModelMessageType里面定义消息字段:
/**
* 玩家金币变更
*/
public static USER_GOLD_UPDATE: string = "USER_GOLD_UPDATE";
在FarmPanel里面进行消息的注册,直接放在careMessage里就行
/**
* 需要关心的消息
*/
public get careMessages(): string[]
{
return [ModelMessageType.USER_GOLD_UPDATE, ModelMessageType.USER_DIAMOND_UPDATE, ModelMessageType.FARM_INFO_CHANGED];
}
/**
* 接收到消息时的处理函数
*/
public updateData(type: string): void
{
switch(type)
{
case ModelMessageType.USER_GOLD_UPDATE:
this.updateCoin();
break;
case ModelMessageType.USER_DIAMOND_UPDATE:
this.updateTicket();
break;
case ModelMessageType.FARM_INFO_CHANGED:
this.updateFarmLevel();
break;
}
}
在LoginModel里面的金币进行修改时,调用updateModel发送ModelMessageType.USER_GOLD_UPDATE信息
/**
* 玩家金币
*/
public get gold(): number
{
return this._userInfo.coin;
}
public set gold(value: number)
{
if (this._userInfo == null)
{
return;
}
this._userInfo.coin = value;
this.updateModel(ModelMessageType.USER_GOLD_UPDATE);
}