1

Robotlegs/Signals を使用すると、このような警告メッセージが表示されます。このコマンド クラスが実行されるたびに、2 ~ 3 秒ごとに..このメッセージが以下に表示されます

このマッピングを意図的に上書きした場合は、このメッセージが表示されないようにするために、置換マッピングの前に「injector.unmap()」を使用できます。警告: インジェクターには、「」という名前のタイプ「mx.messaging.messages::IMessage」のルールが既にあります。

それ以外の場合、コマンドは正常に機能しますが、とにかく何か間違ったことをしていると思います。

    public class MessageReceivedCommand extends SignalCommand
    {

        [Inject]
        public var message:IMessage;

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

ペイロードが正常に受信されることに加えて、 mapSignalClass のオプションしか表示されないため、アプリケーションコンテキストは IMessage をこのコマンドにマップしません。

このメッセージを修正または非表示にする方法を誰かが知っているかどうか疑問に思います. 警告が示唆するように、これを呼び出してみました

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拡張機能を詳しく調べましたが、これは実際にはバグだと思います。関連する問題が1年前に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()

ここでの問題は、シグナルの連鎖によるものです。つまり、コマンドの実行中に同じシグナルが再度発生するため、マッピングが2回発生します。つまり、「ネストされた」シグナルです。

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 に答える