我正在为我的应用程序使用RobotLegs和Signals。这是我第一次使用Robotlegs,我正在使用Joel Hooks Signal Command Map example here
我注意到与事件相比,它似乎相当冗长。对于每个Signal,我必须创建一个新类,而对于事件,我会将事件类型分组到一个类中。
我喜欢这种直观和即时描述的方式..只需浏览信号包即可显示所有应用通讯。虽然对我来说似乎很啰嗦。
其他人是否正在使用此功能,我使用这样的信号的方式是正确的,还是让人们找到解决这种冗长问题的方法?
干杯
答案 0 :(得分:1)
这是正确的方法。信号的主要优点是你可以将它们包含在你的界面定义中,但显然你最终会得到一大堆信号。
一般情况下,我仅将信号用于我的view-> mediator和service->命令通信(1对1)。对于系统范围的通知,我使用事件(n到n)。它使信号的数量更易于管理。 但显然这是一个偏好问题。
使用一个好的IDE和/或模板系统可以减轻许多必须创建各种信号的“痛苦”。
答案 1 :(得分:0)
你没有为Command map创建一个新的信号类,这是一个很好的做法。你可以给“dataType”类一个类型属性 - 并对其进行switch
。但这对命令来说会很混乱。但请注意,命令基本上用于触发应用程序范围的操作。
并非所有信号都会触发应用程序范围的操作。
例如,如果您要响应来自单个View
的一堆事件。我建议为相关的“观看事件”制作Signal
课程(例如MyButtonSignal
为MyButtonView
)并为其提供类型属性。
我的典型信号如下:
package {
public class MyButtonSignal extends Signal {
public static const CLICK:String = 'myButtonClick';
public static const OVER:String = 'myButtonOver';
public function MyButtonSignal() {
super(String, Object);
}
}
}
像这样派遣
myButtonSignal.dispatch(MyButtonSignal.CLICK, {name:'exit'});
正常聆听:
myButtonSignal.add(doMyButtonSignal);
处理信号如下:
protected function doMyButtonSignal(type:String, params:Object):void {
switch(type) {
case MyButtonSignal.CLICK: trace('click', params.name);
break;
case MyButtonSignal.OVER: trace('OVER', params.name);
break;
}
}
有时候为data
变量赋予自己的数据类很有用。
所以每当你意识到“哎呀,我需要对另一个事件做出反应”时,你只需转到Signal
并添加一个新的静态const来表示事件。就像你(可能是?)在使用Event
对象时那样。
答案 2 :(得分:0)
对于每个信号,我必须创建一个新类,而对于事件我 将事件类型分组为一个类。
而不是这样做你可以将信号用作财产......如:
public var myCustomSignal:Signal = new Signal(String,String);
您可以将信号视为对象/接口的属性。
在Joel的例子中,他使用信号来表示系统级事件,并将它们与机器人信号映射一起映射,SignalMap按类型映射信号。因为它们是按类型映射的,所以需要为每个系统级信号创建唯一类型。