1

在使用 Robotlegs/Signals 时,我会出现一堆这样的警告消息。每次执行此命令类时,即每 2-3 秒 ..此消息显示在下方

如果您有意覆盖了此映射,则可以在替换映射之前使用“injector.unmap()”以避免看到此消息。警告:Injector 已经有一个“mx.messaging.messages::IMessage”类型的规则,命名为“”。

该命令功能正常,但我认为无论如何我做错了什么。

    public class MessageReceivedCommand extends SignalCommand
    {

        [Inject]
        public var message:IMessage;

            ...etc.. do something with message..
    }

应用程序上下文不会将 IMessage 映射到此命令,因为我只看到 mapSignalClass 的一个选项,除了有效负载接收良好。

想知道是否有人知道我如何修复或抑制此消息。我试过把它称为警告建议

injector.unmap(IMessage, "")

但我收到一个错误 - 找不到名为“”的 ::IMessage 的映射。

谢谢

编辑:有关错误的更多信息

这是我发送给命令的信号

public class GameMessageSignal extends Signal
{   
    public function GameMessageSignal()
    {
        super(IMessage);
    }
}

从 IPushDataService 类调度

    gameMessage.dispatch(message.message);

并且实现在应用程序上下文中通过

injector.mapClass(IPushDataService, PushDataService);

随着信号

signalCommandMap.mapSignalClass(GameMessageSignal, MessageReceivedCommand);

编辑#2:可能还需要指出我将 GameMessageSignal 的一个实例注入 IPushDataService

public class PushDataService extends BaseDataService implements IPushDataService
{
   [Inject]
   public var gameMessage:GameMessageSignal;

   //then

   private function processMessage(message:MessageEvent):void
   {
          gameMessage.dispatch(message.message);
   }
}

编辑:3

我在 SignalContext 中设置的映射:

injector.mapSingleton(IPushDataService);

injector.mapClass(IPushDataService, PushDataService);
4

2 回答 2

1

好的,我仔细研究了 Signals 扩展,我相信这实际上是一个错误。一年前已经在github上提交了一个相关问题,但尚未修复。该警告与信号映射到命令的方式有关:

(来自SignalCommandMap

protected function routeSignalToCommand(signal:ISignal, valueObjects:Array, commandClass:Class, oneshot:Boolean):void
{
    mapSignalValues( signal.valueClasses, valueObjects );
    createCommandInstance( commandClass ).execute();
    unmapSignalValues( signal.valueClasses, valueObjects );
    (...)

映射仅在调用 之前分配mySignalCommand.execute(),并在之后立即删除。这就是你不能手动的原因unmap()

这里的问题是由于信号链造成的,即在执行命令期间再次触发相同的信号,因此映射发生两次 - “嵌套”信号,可以这么说:

Signal.dispatch
    => mapValues 
    => execute() 
        => Signal.dispatch 
            => mapValues 
            => execute() 
            => unmapValues()
    => unmapValues()

我在 RobotLegs2 框架中遇到了类似的事件映射问题,并提交了一个错误修复。因此,我确信一旦使用 RL2,这将不再困扰任何人,但在此之前,您可能只想对 Signals 扩展应用等效补丁并将其用作解决方法。

它应该很简单:只需将命令的实例化和执行解耦。在上述routeSignalToCommand()方法中SignalCommandMap,替换为:

mapSignalValues( signal.valueClasses, valueObjects );
createCommandInstance( commandClass ).execute();
unmapSignalValues( signal.valueClasses, valueObjects );

有了这个:

mapSignalValues( signal.valueClasses, valueObjects );
var command:* = createCommandInstance( commandClass );
unmapSignalValues( signal.valueClasses, valueObjects );
command.execute();

现在,由于我既没有使用 RL1 也没有使用 Signals,所以我无法自己测试它 - 如果您有任何问题,请尝试并发表评论。

于 2012-10-07T09:01:47.190 回答
1

这些映射问题在 RL2 的 SignalCommandMap 扩展中得到修复。你可以在这里找到它: https ://github.com/pixels4nickels/robotlegs-extensions-SignalCommandMap 我试图解决问题并及时更新。(链接多个命令也可以)

于 2013-03-20T04:11:55.177 回答