Robotlegs Image Gallery Example using AS3-Signals and the Presentation Model

Jason Crist posted a thought provoking request for his upcoming presentation comparing Robotlegs and Swiz. He’s got a clever knack for stirring the framework ant pile and getting developers eyes off their IDEs long enough to discuss their passions. In this case the developers include Ben Clinkinbeard, Shaun Smith, Jesse Warden and myself.

These conversations are always good natured. While we work on (or use) “competing” frameworks there is always a sense of mutual respect. We like our tools but have obvious inclinations towards the projects that we’ve invested our hearts and souls into.

Ben Clinkinbeard has pointed out (several times!) that Robotlegs is all about extending the MVCS classes. My stock answer is that there is a clear separation between the framework and the concrete MVCS implementation. To paraphrase Ben, “Well show it to me then!”

All of the “official” Robotlegs examples are making use of the MVCS implementation. Why? Because it is solid, recognizable, and fairly easy to get one’s head around. It provides a common ground for developers and a set architectural structure which is a huge advantage in any team environment. It is important to make the distinction between the framework and the MVCS implementation. What does that even mean? At the core, Robotlegs is a modular set of tools to provide a convenient mechanism for wiring applications. Robotlegs is not doing class reflection. Robotlegs is not an automated dependency injection solution. Robotlegs is an adapter to a dependency injection solution,by default the lightweight SwiftSuspenders library. Through a set of tools, namely the MediatorMap, CommandMap, ViewMap, and the injection adapter Robotlegs provides a robust starting place to begin coding your application.

The MVCS implementation is a set of base classes loosely modeled on PureMVC. At the heart of the implementation is the Context. The Context creates instances of the various mapping classes, the injection adapter, and gives the developer a centralized IEventDispatcher that can be used for messaging between application tiers.. The other three classes, Actor, Mediator, and Command, reduce boiler plate and provide convenient access to injected dependencies typically used in the the MVCS tiers.

What if you hate PureMVC, don’t want to extend any framework classes, or generally just want to work in a different way outside of a prescribed MVCS architecture?

No problem.

Here’s the deal. Robotlegs, the framework, is a set of interfaces. You can effectively do whatever you want with these interfaces. You can make use of the base concrete implementations of the core interfaces, use a class from the MVCS implementation, implement your own concrete classes based on the framework core, bring in other libraries or any combination you can think of. In terms of a framework, Robotlegs can be whatever you want/need it to be.

Man Joel, that was a long intro. Where’s the freaking code??!?


So, to that end, I sat down to rework my first (and still favorite) Robotlegs example application and demonstrate this concept a bit.

I’ve stripped the example down slightly, using just the XMLImageService and not connecting to Flickr (in an effort to keep it simple).

Get the source on GitHub
Download the full source as a Zip

This example requires:
Robotlegs
AS3-Signals
SignalsCommandMap library
Flex 4 SDK (a fairly recent version)

You neeed SDK version 4.0.0.12635 or later to compile this…

Get Adobe Flash player



The example should be familiar if you’ve looked at the Image Gallery previously. It loads images from a service and displays them. This version is much different on the code level however. Instead of mediators and data models, the gallery is using presentation models and AS3-Signals. It still uses the Context from the MVCS implementation. it’s so f’n handy and I don’t want to manually instantiate the maps.

ImageGalleryContext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class ImageGalleryContext extends Context
{
	private const VIEW_PACKAGE:String = "org.robotlegs.examples.imagegallery.view.components";
	private const LOAD_GALLERY:String = "loadGallery";
 
	override public function startup():void
	{
		//map the views
		viewMap.mapPackage(VIEW_PACKAGE);
 
		//map the presentation models
		injector.mapSingletonOf( IGalleryViewPresentationModel, GalleryViewPresentationModel );
		injector.mapSingletonOf( IGalleryThumbnailsPresentationModel, GalleryThumbnailsPresentationModel );
 
		//map the services and their factories
		injector.mapSingletonOf( IGalleryImageService, XMLImageService );
		injector.mapSingletonOf( IGalleryFactory, XMLGalleryFactory );
 
		//map the signals
		injector.mapSingleton(GalleryUpdatedSignal);
		injector.mapSingleton(GalleryImageSelectedSignal);
 
		//map the command
		commandMap.mapEvent( LOAD_GALLERY, LoadGalleryCommand );
 
		//go!!
		eventDispatcher.dispatchEvent(new Event(LOAD_GALLERY));
	}
}

As you can see here the context is performing the duty of mapping the injections the application will use.

Automated Dependency Injected View

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<s:Group xmlns:fx="https://ns.adobe.com/mxml/2009"
		 xmlns:s="library://ns.adobe.com/flex/spark"
		 xmlns:mx="library://ns.adobe.com/flex/halo" width="100%" height="100">
	<fx:Script>
		<![CDATA[
			import org.robotlegs.examples.imagegallery.view.models.IGalleryThumbnailsPresentationModel;
 
			private var _model:IGalleryThumbnailsPresentationModel;
 
			public function get model():IGalleryThumbnailsPresentationModel
			{
				return _model;
			}
 
			[Inject]
			[Bindable]
			public function set model(value:IGalleryThumbnailsPresentationModel):void
			{
				_model = value;
			}
		]]>
	</fx:Script>
	<s:Rect width="100%"
			height="100%">
		<s:fill>
			<s:SolidColor color="#111111"/>
		</s:fill>
	</s:Rect>
	<s:Group width="100%" height="100%">
		<s:layout>
			<s:VerticalLayout gap="0"/>
		</s:layout>
		<s:DataGroup id="dgThumbnails"
					 clipAndEnableScrolling="true"
					 dataProvider="{model.dataProvider}"
					 width="100%"
					 height="85"
					 itemRenderer="org.robotlegs.examples.imagegallery.view.components.renderers.GalleryImageThumbnailItemRenderer">
			<s:layout>
				<s:HorizontalLayout gap="0"/>
			</s:layout>
		</s:DataGroup>
		<s:HScrollBar id="thumbScrollBar"
					  viewport="{dgThumbnails}"
					  width="100%"
					  smoothScrolling="true"/>
	</s:Group>
</s:Group>

The viewMap is set to map the entire components folder. This is a convenient way to provide automated dependency injection to a large number of views. It also maps views in any sub-package of the mapped package.

GalleryViewThumbnailsPresentationModel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[Bindable]
public class GalleryThumbnailsPresentationModel implements IGalleryThumbnailsPresentationModel
{
	[Inject]
	public var updated:GalleryUpdatedSignal;
 
	[Inject]
	public var imageSelected:GalleryImageSelectedSignal;
 
	[PostConstruct]
	public function mapSignalListeners():void
	{
		updated.add(galleryUpdated);
		imageSelected.add(updateImageSelectionState);
	}
 
	private var _dataprovider:ArrayCollection;
 
	public function get dataProvider():ArrayCollection
	{
		return _dataprovider;
	}
 
	public function set dataProvider(v:ArrayCollection):void
	{
		_dataprovider = v;
	}
 
	private function galleryUpdated(gallery:Gallery):void
	{
		dataProvider = gallery.photos;
		if(gallery.photos[0])
		{
			imageSelected.dispatch(gallery.photos[0]);
		}
	}
 
	private function updateImageSelectionState(image:GalleryImage):void
	{
		for each(var galleryImage:GalleryImage in dataProvider)
		{
			galleryImage.selected = galleryImage == image;
		}
	}
}

IGalleryViewThumbnailsPresentationModel

1
2
3
4
5
6
7
8
/**
 * This interface is simple because the application is simple. Obviously in
 * a large application you'd get more complex interfaces.
 */
public interface IGalleryThumbnailsPresentationModel
{
	function get dataProvider():ArrayCollection;
}

The presentation models are provided as singletons. The application will only display one of each view that requires the model. They are also mapped as interfaces with the interfaces being injected into the views. With the presentation model, the view does not update the model directly. By using interfaces we can supply read-only contracts between the presentation models and the views they control:

XMLImageService

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class XMLImageService implements IGalleryImageService
{
	protected static const BASE_URL:String = "assets/gallery/";
 
	[Inject]
	public var galleryFactory:IGalleryFactory;
 
	[Inject]
	public var galleryUpdated:GalleryUpdatedSignal;
 
	public function XMLImageService()
	{
		super();
	}
 
	public function loadGallery():void
	{
		var service:HTTPService = new HTTPService();
		var responder:Responder = new Responder(handleServiceResult, handleServiceFault);
		var token:AsyncToken;
		service.resultFormat = "e4x";
		service.url = BASE_URL+"gallery.xml";
		token = service.send();
		token.addResponder(responder);
	}
 
	protected function handleServiceResult(event:Object):void
	{
		var gallery:Gallery = galleryFactory.createGallery(event.result.image, BASE_URL);
		galleryUpdated.dispatch( gallery );
	}
 
	protected function handleServiceFault(event:Object):void
	{
		trace(event);
 
	}
}

IGalleryImageService

1
2
3
4
public interface IGalleryImageService
{
	function loadGallery():void;
}

The service and its factory class are also mapped as singleton interfaces. This makes it really easy to swap out services (to add a Flickr service for example).

GalleryUpdatedSignal

1
2
3
4
5
6
7
public class GalleryUpdatedSignal extends Signal
{
	public function GalleryUpdatedSignal()
	{
		super(Gallery);
	}
}

The signals are simple classes that merely extend the Signal class and declare their payload type in the super() of the constructor. Signals are a really marvelous concept and provide a lot of very nice functionality. They make a great companion to Robotlegs and I think you will see some really cool stuff being done with Signals and Robotlegs in the very near future.

LoadGalleryCommand

1
2
3
4
5
6
7
8
9
10
public class LoadGalleryCommand
{
	[Inject]
	public var service:IGalleryImageService;
 
	public function execute():void
	{
		service.loadGallery();
	}
}

The application has a single command, LoadGalleryCommand, that is used to actually load the initial images from service and is only called once. In fact, the event that is fired to launch this command in the context startup method is the only event that this application uses (outside of the Flex events on the UI items). That is awesome!

Something you will notice right away looking at the source is that the ImageGalleryContext is the only class that extends a Robotlegs class. You could do without that too, frankly, and create your own context that created the maps and injector instances. I’m not a masochist however, and I will use the provided context for this example. There is a huge amount of potential there for implementing your own custom contexts. I think an interesting implementation might pitch Flash Events altogether and use only Signals for communication between application actors. This example is essentially doing that, but I’d like to get rid of that single event in startup too!

Download the full source as a Zip

Let me know if you make something cool with Robotlegs and post details about it, I’ve got a stack of these to give away:

photo
  • https://github.com/stray Stray

    Great article – thanks Joel.

    I've looked at as3signals a bunch of times and struggled to work out how it would avoid spaghetti (though I knew it must because RP is no bozo!). What I'd really not understood – and your example makes so beautifully clear – is that by using the RL injection mapping to inject a singleton of the signal type, you can share a signal without the classes tuning in to that signal knowing anything about each other.

    Mind blowing stuff!

    Signals feel more and more to me like TV Stations that promise to broadcast a particular kind of content. “Just fishin' here – no car chases.”

    A naive question: does it work if you define an interface instead of a class in the signal construction? As in IGallery instead of Gallery? Would that have benefits or drawbacks at all? I've got a hunch that it would make testing easier, but it's not really founded on anything. I guess I could mock and stub out the functions but sometimes I like to create a one-code-fits-all-tests concrete implementation of an interface that spits the same data each time.

    I was going to ask about compile time error checking… but of course the conventional event model in Flex/Flash doesn't provide a lot of that anyway.

    Seriously – thanks – I *knew* there was a beautiful marriage to be made but had completely overlooked how elegantly it could be achieved.

  • https://joelhooks.com Joel Hooks

    Interfaces work perfectly. I'm pretty happy with how this came together. I need to figure out a Signals based command execution scheme. I could just use a controller, but I really fig the encapsulation of a command.

  • https://twitter.com/robpenner robpenner

    Fantastic example. The creative way you used Signals kind of blew my mind. I have some pondering to do.

    P.S. I love the one-click Twitter comment registration. First time I've seen it.

  • https://joelhooks.com Joel Hooks

    I am incredibly excited by the concept of not using events at all outside of components. Signals make a lot more sense to me. Excellent work.

    Disqus is a really fantastic system. Not only did it remove my spam problem, but it is much more usable.

  • https://www.benclinkinbeard.com/ Ben Clinkinbeard

    This is nice. I've only done a quick read-through so far, but it looks very clean. I am a fan of the presentation model pattern, and of course like the absence of framework class extension.

    Not to be cheeky, but it kind of reminds me of a Swiz application. :) One of the reasons I like Swiz so much is that I feel like it allows you to focus on writing code that has a “business purpose”, and I think this app does that as well. The context is pretty equivalent to a Swiz BeanProvider, etc. I'm not saying these things to promote Swiz or anything like that, just pointing out the good, framework-independent qualities that this architecture possesses in my opinion.

    I've not looked into Signals yet, but this makes me want to. Great work Joel, consider me impressed.

  • https://pbking.com/blog Jason Crist

    Great. You put your code where your mouth was. I appreciate that a lot Joel. Easy alternatives in getting a framework to work like me rather than getting me to work like X is important to me and this is a good example of that.

  • https://twitter.com/robpenner robpenner

    Joel, how do you feel now about Presentation Model after doing this example?

  • https://pbking.com/blog Jason Crist

    Oh yes, please do tell.

  • https://joelhooks.com Joel Hooks

    Signals is wicked. I didn't really need it here, but I've been dying to get into it.

    But really, it all comes down to the logo ;)

  • https://joelhooks.com Joel Hooks

    The things I don't like about PM are still there. I don't like the binding into the app layer. I don't like losing the “overlord” capabilities that the mediator gives me. I don't like the PM in the view component. I'm a control freak and the PM feels like I am relegating some measure of control that mediators give me. I want to pass/bind VALUES to my view components, not full on Objects.

    I'll take the PM over a shitty code behind scheme any day (and Signals improves my disposition a bit), but I'm still voting for mediator as my preference.

    I'm using proper PMs on the current gig with Swiz, so I've spent a good 10 hours a day for the last 5 weeks to build my opinion ;)

  • https://joelhooks.com Joel Hooks

    Putting my code where my mouth was (gross?) is an homage to Mr. Penner and Signals.

  • https://github.com/stray Stray

    Great article – thanks Joel.

    I've looked at as3signals a bunch of times and struggled to work out how it would avoid spaghetti (though I knew it must because RP is no bozo!). What I'd really not understood – and your example makes so beautifully clear – is that by using the RL injection mapping to inject a singleton of the signal type, you can share a signal without the classes tuning in to that signal knowing anything about each other.

    Mind blowing stuff!

    Signals feel more and more to me like TV Stations that promise to broadcast a particular kind of content. “Just fishin' here – no car chases.”

    A naive question: does it work if you define an interface instead of a class in the signal construction? As in IGallery instead of Gallery? Would that have benefits or drawbacks at all? I've got a hunch that it would make testing easier, but it's not really founded on anything. I guess I could mock and stub out the functions but sometimes I like to create a one-code-fits-all-tests concrete implementation of an interface that spits the same data each time.

    I was going to ask about compile time error checking… but of course the conventional event model in Flex/Flash doesn't provide a lot of that anyway.

    Seriously – thanks – I *knew* there was a beautiful marriage to be made but had completely overlooked how elegantly it could be achieved.

  • https://joelhooks.com Joel Hooks

    Interfaces work perfectly. I'm pretty happy with how this came together. I need to figure out a Signals based command execution scheme. I could just use a controller, but I really dig the encapsulation of a command.

  • https://twitter.com/robpenner robpenner

    Fantastic example. The creative way you used Signals kind of blew my mind. I have some pondering to do.

    P.S. I love the one-click Twitter comment registration. First time I've seen it.

  • https://joelhooks.com Joel Hooks

    I am incredibly excited by the concept of not using events at all outside of components. Signals make a lot more sense to me. Excellent work.

    Disqus is a really fantastic system. Not only did it remove my spam problem, but it is much more usable.

  • https://www.benclinkinbeard.com/ Ben Clinkinbeard

    This is nice. I've only done a quick read-through so far, but it looks very clean. I am a fan of the presentation model pattern, and of course like the absence of framework class extension.

    Not to be cheeky, but it kind of reminds me of a Swiz application. :) One of the reasons I like Swiz so much is that I feel like it allows you to focus on writing code that has a “business purpose”, and I think this app does that as well. The context is pretty equivalent to a Swiz BeanProvider, etc. I'm not saying these things to promote Swiz or anything like that, just pointing out the good, framework-independent qualities that this architecture possesses in my opinion.

    I've not looked into Signals yet, but this makes me want to. Great work Joel, consider me impressed.

  • https://pbking.com/blog Jason Crist

    Great. You put your code where your mouth was. I appreciate that a lot Joel. Easy alternatives in getting a framework to work like me rather than getting me to work like X is important to me and this is a good example of that.

  • https://twitter.com/robpenner robpenner

    Joel, how do you feel now about Presentation Model after doing this example?

  • https://pbking.com/blog Jason Crist

    Oh yes, please do tell.

  • https://joelhooks.com Joel Hooks

    Signals is wicked. I didn't really need it here, but I've been dying to get into it.

    But really, it all comes down to the logo ;)

  • https://joelhooks.com Joel Hooks

    The things I don't like about PM are still there. I don't like the binding into the app layer. I don't like losing the “overlord” capabilities that the mediator gives me. I don't like the PM in the view component. I'm a control freak and the PM feels like I am relegating some measure of control that mediators give me. I want to pass/bind VALUES to my view components, not full on Objects.

    I'll take the PM over a shitty code behind scheme any day (and Signals improves my disposition a bit), but I'm still voting for mediator as my preference.

    I'm using proper PMs on the current gig with Swiz, so I've spent a good 10 hours a day for the last 5 weeks to build my opinion ;)

  • https://joelhooks.com Joel Hooks

    Putting my code where my mouth was (gross?) is an homage to Mr. Penner and Signals.

  • Alexander Jäger

    You have a Typo in the href in the Git Link :)

  • https://joelhooks.com Joel Hooks

    d'oh! Fixed, thank you. :>

  • Alexander Jäger

    You have a Typo in the href in the Git Link :)

  • https://joelhooks.com Joel Hooks

    d'oh! Fixed, thank you. :>

  • varriastudios

    thank you for showing the source code, sharedtut

  • varriastudios

    thank you for showing the source code, sharedtut

  • codecraig

    I've created several Flex modules making use of Robotlegs. The modules get loaded and presented when the user wants (i.e. they click on the icon in the dock). The modules are able to communicate with one another and with the servers they originate from (think mashup).

    I use Robotlegs throughout for commands, mediators, models and services, however, I implemented my own REST service “helper”. This put me in a weird spot for a minute b/c I didn't want to extend Actor to have these helpers play with the rest of the Robotlegs goodies…which is why I posted on the Robotlegs discussion board. Then I realized I could just use the bits I wanted without extending Actor, and wa-la!

    So much better than PureMVC and the fact that I could strip away the use of some of the concrete classes is a perk as well…can't wait to use it on my next project. Maybe if I had a RL patch I could spread the love ;)

  • https://joelhooks.com Joel Hooks

    We have a chicken and egg situation with the patches! They will be delivered to those that make significant contributions via content, tutorials, code etc ;)

  • codecraig

    Gotcha. Well I've been working on a new Groovy project which is currently a command line thing…would be nice to have a UI…perhaps I'll look into it while using RL and then post it up.

    Thanks

  • codecraig

    I've created several Flex modules making use of Robotlegs. The modules get loaded and presented when the user wants (i.e. they click on the icon in the dock). The modules are able to communicate with one another and with the servers they originate from (think mashup).

    I use Robotlegs throughout for commands, mediators, models and services, however, I implemented my own REST service “helper”. This put me in a weird spot for a minute b/c I didn't want to extend Actor to have these helpers play with the rest of the Robotlegs goodies…which is why I posted on the Robotlegs discussion board. Then I realized I could just use the bits I wanted without extending Actor, and wa-la!

    So much better than PureMVC and the fact that I could strip away the use of some of the concrete classes is a perk as well…can't wait to use it on my next project. Maybe if I had a RL patch I could spread the love ;)

  • https://joelhooks.com Joel Hooks

    We have a chicken and egg situation with the patches! They will be delivered to those that make significant contributions via content, tutorials, code etc ;)

  • codecraig

    Gotcha. Well I've been working on a new Groovy project which is currently a command line thing…would be nice to have a UI…perhaps I'll look into it while using RL and then post it up.

    Thanks

  • Yennick Trevels

    Very nice article. Shows again that robotlegs can be used in many ways.
    Joel, do you know whether you have to remove the listeners which you added to a signal manually to clean things up(like with standard flex event listeners), or is this done automaticly by signals?

  • JP

    So in trying to compile this project i'm getting some errors.

    I can't seem to find this class in robotlegs:
    org.robotlegs.mvcs.SignalContext

    Is this in a dev branch somewhere or is it in master and i'm just blind?

  • Yennick Trevels

    Very nice article. Shows again that robotlegs can be used in many ways.
    Joel, do you know whether you have to remove the listeners which you added to a signal manually to clean things up(like with standard flex event listeners), or is this done automaticly by signals?

  • JP

    So in trying to compile this project i'm getting some errors.

    I can't seem to find this class in robotlegs:
    org.robotlegs.mvcs.SignalContext

    Is this in a dev branch somewhere or is it in master and i'm just blind?

  • https://joelhooks.com Joel Hooks

    sorry, my bad. I modified it to use the SignalsCommandMap lib I am working on. https://github.com/joelhooks/signals-extensions-…

  • https://joelhooks.com Joel Hooks

    sorry, my bad. I modified it to use the SignalsCommandMap lib I am working on. https://github.com/joelhooks/signals-extensions-…

  • Elad Elrom

    Awesome times last night on RIARadio, Great post thanks Joel. To add to this example I created an implementation of RobotLegs using the Presentation Model that access entire component's events lifecycle using the passive view:
    https://elromdesign.com/blog/2010/01/23/robotleg…

  • Elad Elrom

    Awesome times last night on RIARadio, Great post thanks Joel. To add to this example I created an implementation of RobotLegs using the Presentation Model that access entire component's events lifecycle using the passive view:
    https://elromdesign.com/blog/2010/01/23/robotleg…

  • https://www.gucci-outlet-store.com/ gucci

    Well , the view of the passage is totally correct ,your details is really reasonable and you guy give us valuable informative post, I totally agree the standpoint of upstairs. I often surfing on this forum when I m free and I find there are so much good information we can learn in this forum! https://www.in-donesia.net/

  • Jb

    Thanks Joel for this example.. Really useful and a good implementation of PM with Robotlegs.

    I got a question concerning the GalleryImageThumbnailItemRenderer component.
    You choose to dispatch the ImageSelectedSignal in the click of a thumbnail.
    I understand by this way, you can advise the other PM (GalleryViewPresentationModel) to update the preview. But regarding the PM mind, does it was preferable to have a function in the PM (GalleryThumbnailsPresentationModel) like changeImageSelected and call it directly from the component (model.changeImageSelected(String)) who perform the signal dispatch and the updateImageSelectionState ?
    In this way your view should be totaly passive.

    What do you think ?

  • https://www.flashxml.net/galleries/ flash gallery

    Robotlegs and AS3 signals are when combined together, works great.Both fixes object-oriented principles to implement its goals. Signals is very well automated dependency injection. Combining the signals and Robotlegs you can turn off the flash events within your application layer.

  • Hebejin

    good article, it is worth to having a good read.

  • https://profiles.google.com/dadmyshitsays Sam Rivello

    Download a free AS3-Signals Presentation PDF and AS3-Only project here!

    https://www.blog.rivellomultime…

    -Samuel Asher Rivello
    https://www.RivelloMultimediaCo…

  • https://profiles.google.com/samuel.tilly Samuel Tilly

    I am a bit confused by this, i have been developing a huge application for a while and recently started to look into using the MVC model when doing a complete rewrite of this application. The only previous MVC experience that i have is from CakePHP, the thing i don't get is really the structure of things here, i started going through the guides over at robotlegs.org and was a bit confused about the mediator stuff, i was afraid it would be an issue later on in my project so i started looking at implementing signals into robotlegs but i don't really understand the structure of this code.

    Why is modules in .vo and what is the real advantage of using interfaces for each model?

    Why is the LoadGalleryCommand in controllers? maby just the name confuses me here.

    Is there a way of having the service loading only if views depending on it is mapped in the context? without ApplicationStartSignal?

    Can signals me automatically added to context the same way views are?

    Sorry for the novice questions and thanks for this great article!

  • https://www.facebook.com/people/Hrithik-Shah/100001617339268 Hrithik Shah

    Thanks for the great article it really helps me in understanding as3 signals. Finally mine search ends here. Thanks once again.

    https://fungamingzone.com/