4

我在我的应用程序中使用 RobotLegs 和 Signals。这是我第一次使用 Robotlegs,我在这里使用 Joel Hooks Signal Command Map 示例

我注意到与事件相比,它似乎非常冗长。对于每个 Signal,我必须创建一个新类,而对于事件,我会将事件类型分组到一个类中。

我喜欢这是多么直观和即时的描述……只需浏览一个信号包就会显示所有应用程序通信。虽然这对我来说似乎很冗长。

其他人在使用这个吗,我使用这样的信号的方式是否正确,或者人们是否找到了绕过这种冗长的方法?

干杯

4

3 回答 3

1

虽然这是正确的方法。信号的主要优点是您可以将它们包含在接口定义中,但显然您最终会得到一大堆信号。

通常,我仅将信号用于我的视图-> 调解器和服务-> 命令通信(1 对 1)。对于系统范围的通知,我使用事件(n 到 n)。它使信号的数量更易于管理。但这显然是一个偏好问题。

使用良好的 IDE 和/或模板系统可以减轻许多必须创建各种信号的“痛苦”。

于 2012-02-10T13:47:50.003 回答
0

不必为命令地图创建新的信号类,这只是一个好习惯。你可以给“dataType”类一个类型属性——然后做一个switch。但这对于命令来说会很混乱。但请注意,命令基本上是用于触发应用程序范围的操作。

并非所有信号都会触发应用程序范围的操作。

例如,如果您要响应来自单个View. 我建议Signal为相关的“查看事件”(例如MyButtonSignalfor 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对象时所做的那样。

于 2012-03-09T04:48:50.183 回答
0

对于每个 Signal,我必须创建一个新类,而对于事件,我会将事件类型分组到一个类中。

您可以将信号用作属性而不是这样做……例如:

public var myCustomSignal:Signal = new Signal(String,String);

您可以将信号视为对象/接口的属性。

在 Joel 的示例中,他使用信号来表示系统级事件,并将它们与按类型映射信号的机械臂 SignalMap 进行映射。因为它们是按类型映射的,所以您需要为每个系统级信号创建一个唯一类型。

于 2013-03-12T22:25:48.617 回答