Futurescale, Inc. PureMVC Home

The PureMVC Framework Code at the Speed of Thought


Over 10 years of community discussion and knowledge are maintained here as a read-only archive.

New discussions should be taken up in issues on the appropriate projects at https://github.com/PureMVC

Pages: [1]
Print
Author Topic: Mediator best practice.  (Read 6550 times)
valuetime
Newbie
*
Posts: 2


View Profile Email
« on: January 13, 2009, 06:15:51 »

Since day one of using PureMVC, I have passed through a display object container as a Mediator constructor's viewComponent parameter (instead of creating a UI component before creating the mediator, as in the HelloFlash code example). A colleague pointed out that this is "incorrect". An example:

Say I have a command, which creates a Mediator:

SimpleCommand.as:

:
override public function execute(note:INotification):void
{
var stage:Stage = note.getBody() as Stage;
facade.registerMediator(new TestMediator("test", stage));
}

And in the constructor of said Mediator, I create a display object:

SimpleCommand.as:

:
private var _sprite:Sprite;

public function TestMediator(mediatorName:String = null, viewComponent:Object = null):void
{
super(mediatorName, viewComponent);
_sprite = new Sprite();
viewComponent.addChild(_sprite);
}

If I do it this way, I only put a reference to my UI component inside its mediator, not inside the command that creates it. Also, I can remove it from the stage, even delete it and re-create it if necessary.

Here's how I'm being told to do it:

SimpleCommand.as:

:
override public function execute(note:INotification):void
{
var stage:Stage = note.getBody() as Stage;
var sprite:Sprite = new Sprite();
stage.addChild(sprite);
facade.registerMediator(new TestMediator("test", sprite));
}

So, my question is... Why does it work this way? If I remove my TestMediator, I am still left with a sprite that has no direct references and no instance name, and therefore, no way to remove it from the stage!

Also, I much prefer to link my mediators to my UI components (which are intrinsically linked anyway) rather than putting them in stateless commands or unrelated mediators.

Am I totally missing something here?

Thanks.
Logged
puremvc
Global Moderator
Hero Member
*****
Posts: 2871



View Profile WWW Email
« Reply #1 on: January 13, 2009, 06:53:23 »

Generally speaking in Flash, you should have a StageMediator with the one and only reference to the stage. When you wand to add something to the stage you should send the object to be added in a note that the StageMediator is interested in.


Also, in your code above, there is no reason to declare a _sprite instance var. That's just one more ref to be nulled. The viewComponent is the sprite. Just write a getter that returns viewComponent cast to Sprite.

As for creating the sprite to be added inside its Mediator, sure, no problem with that. Change your mediator to something like:

:
public function MyMediator(){
   super("test",new Sprite())
}

public function onRegister():void{
SendNotification(ApplicationFacade.ADD_TO_STAGE, mySprite);
}

public function onRegister():void{
SendNotification(ApplicationFacade.REMOVE_FROM_STAGE, mySprite);

public function get mySprite():Sprite{
Return viewComponent as Sprite;
}
[\code]


-=Cliff>
Logged
Jason MacDonald
Sr. Member
****
Posts: 243


View Profile Email
« Reply #2 on: January 13, 2009, 07:34:22 »

Just thought I would add that you can still remove a mediators component without having a reference to the stage (or whatever parent) by calling parent.removeChild()

:
... in your mediator....

override public function onRemove():void {
    if(viewComponent) {
        viewComponent.parent.removeChild(viewComponent);
        viewComponent = null;
    }
}


Though you really should have a stage mediator with a listener for a RemoveChild notification. The above works in a crunch though.
Logged
Pages: [1]
Print