ActionStep (plugin View) / Pixlib (MVC FrontController + Remoting) SUSHI Service
The Chief Cook is back ^^. On the menu: Sushis and MVC "on steroids".
Whisk your application with MVC until it peaks form. When your MVC is stiff enough, stuff it with a FrontController. Sprinkle with some MovieClipHelpers. Finally, depending on mood and preferences, baste with a ModelLocator and/ or a ServiceLocator...
Pixlib Remoting SUSHI service ? I hear some people saying: you creatively recycle dude....
In this article I will introduce you to a jewel of Pixlib (there are so many... it' s an Ali Baba's cavern !).
SUSHI service was made up following an extremely powerful and polyvalent application receipe based on the MVC pattern. "Receipe" because it's all about ingredients. According to the ingredients and the inspiration we can, for example, pump up a traditional MVC until reaching a multiple Models' one (ModelLocator) or like in our case, make the whole thing rise up to a "Super MVC" (FrontController and ServiceLocator).
- The User Interface
It's ActionStep (I wish I could test ASWing but no time):
This time, the "forms" or "states" are bundled into an external swf loaded at runtime. Opting for this design supposed a new UI instantiation strategy.
- A system that is totally generic
The addition of the FrontController, MovieClipHelpers and ModelLocator (classe core.Model) to the MVC architecture gives our application an examplary level of modularity. The essential of this article will focus on the description of this "Super MVC". I will look at the aspects that, from my point of view, are the more relevants.
- The Remoting service
Based on an alpha version of the Pixlib remoting package. He is gracefully deployed from a Singleton ServiceLocator.
------------------------------------------------------------------------------------------------------
Note:
The "state" word refers here to the differents views contained into views.swf. You shouldn' t take it on the strict sense of the word (meaning the "state of an application" generally stored into a SharedObject, ValueObject, memento instance or other techniques).
Let's take our marks in images:
The project structure

(Homemade) diagram of the relationships between FrontController, MovieClipHelper, ServiceLocator & ModelLocator

------------------------------------------------------------------------------------------------------
A standalone UI
Dissociated from their previous host (ARP), the differents "states" (order, viewOrders and navigation) inherit once again from MovieClip and are stripped from all event dispatching capabilities.
Conceiving the UI as a "Plug-and-Play" candidate implied to change the way the "states" container initialize. Imported at runtime into a MovieClip (via GraphicLib), the view then, should already come instantiated without any reference to _root.
The trick ? package the classes and place the view on stage using Swfmill
First step: compile the classes
* @mtasc -version 8 -swf "classes.swf" -header 390:270:60:FCFCFC -trust
*/
// Imports...
class org.actionstep.view.sushi.Application extends MovieClip
{
// MovieClip linkage
static var id = (id="__Packages.org.actionstep.view.sushi.Application")+(Object.registerClass(id,Application)?"":"");
private var navigation : MovieClip;
private var order : MovieClip;
private var viewOrders : MovieClip;
private var dataPreloader : MovieClip;
function onLoad()
{
// ActionStep theming
org.actionstep.ASTheme.setCurrent(new
org.actionstep.themes.plastic.ASPlasticTheme());
// Set the initial display state of the application
setInitialDisplayState();
// Views Instantiation (no FLA here)
navigation = attachMovie(Navigation.id,"navigation", 1);
viewOrders = attachMovie(ViewOrders.id,"viewOrders", 2);
order = attachMovie(Order.id,"order", 3);
}
// ...
}
Second: instantiate the Application
<movie version="8" width="390" height="270" framerate="60">
<background color="#ffffff"/>
<frame>
<library>
<clip id="Application" class="org.actionstep.view.sushi.Application" import="classes/classes.swf" />
</library>
<place id="Application" name="app" x="0" y="0" depth="1" />
</frame>
</movie>
-----------------------------------------------------------------------------------------------------
The MVC initialization
The main application (Application.as) is launch as usual with a static main().
The Model is instantiated first. Our unique view, a MovieClipHelper subclass, register to the Model. The controller, a Singleton and FrontController subclass is then initialized. The controller is the backbone of the application. He has the responsability to associate typed events and commands.
{
var model : Model = new SUSHIExpert();
model.addListener( new SUSHIListUI() );
Controller.getInstance().init();
}
I. THE VIEW
Loading of the view
Using GraphicLib (unit-preloading) or Libstack (mass-preloading), 2 concrete implementations of AbstractLib, the loaded views are automatically pushed onto a stack. We later retrieve/ handle each item through a corresponding string identifier. Here, the identifiers are defined as constants (static variables) of the sushi.uis.UIList class. This way we enforce a better tracking of the coupling between the views and their 'accessors' .
gl.setName( UIList.SUSHI_List );
gl.addEventListener( GraphicLib.onLoadInitEVENT, this, _init );
gl.load( "deploy/views.swf" );
or
libs.enqueue(new GraphicLib(this, 20, false), UIList.SUSHI_List, "deploy/views.swf");
libs.addEventListener( LibStack.onLoadCompleteEVENT, this, _init );
libs.execute();
Views are accessible globally in many ways:
- From the Singleton GraphicLibLocator:
- From a MovieClipHelper subclass:
class sushi.uis.SUSHIListUI
extends MovieClipHelper
{
public function SUSHIListUI ()
{
super( UIList.SUSHI_List );
}
}
- From a ViewHelper subclass
import com.bourre.visual.ViewHelper;
import sushi.uis.UIList;
class sushi.uis.SUSHIListUI
extends ViewHelper
{
public function SUSHIListUI ( gl : GraphicLib )
{
super( gl.getView(), UIList.SUSHI_List );
view.app.showDataPreloader();
gl.show();
}
}
Global access to the views is very handy. We can, for example, trigger a behavior from a Command:
Using GraphicLibLocator:
import sushi.uis.UIList;
class sushi.commands.PlaceOrder
implements Command
{
public function execute( e : IEvent ) : Void
{
var myView:MovieClip = GraphicLibLocator.getInstance().getGraphicLib( UIList.SUSHI_List ).getView();
myView.app.orderProcessed();
}
}
Using MovieClipHelper
import sushi.uis.UIList;
class sushi.commands.PlaceOrder
implements Command
{
public function execute( e : IEvent ) : Void
{
var myView = MovieClipHelper.getMovieClipHelper(UIList.SUSHI_List);
myView.view.app.showDataPreloader();
myView.traceTest(); // calling a method on SUSHIListUI
}
}
In our case, Sushi service has only one View , a subclass of MovieClipHelper.
From a MovieClipHelper instance we typically:
- define the behavior of the objects (TextField, MovieClips, v2 components...) using their instance names.
In SUSHI service, the View is not an empty shell.
The external view comes with the following methods:
hideDataPreloader();
showDataPreloader();
orderFormSelect();
viewOrdersFormSelect();
Plus, in each "states" ( Navigation, Order, ViewOrders ), buttons eventHandlers are already defined:
placeOrderButton = (new NSButton()).initWithFrame(new NSRect(300, 205, 80, 22));
placeOrderButton.setStringValue("Place order");
placeOrderButton.setTarget(this);
placeOrderButton.setAction("placeOrder");
view.addSubview(placeOrderButton);
But we have nothing to be worried about ^^. We will manage all this (behaviors and scopes) from our MovieClipHelper subclass.
extends MovieClipHelper
{
private function _initBehaviors() : Void
{
_pbCancelOrder.setTarget(this);
_pbCancelOrder.setAction("cancelOrder");
_dSelectViewOrders = new Delegate(view.app, view.app.viewOrdersFormSelect);
_dShowPreloader = new Delegate(view.app, view.app.showDataPreloader);
}
private function _gotoViewOrders() : Void
{
_dSelectViewOrders.execute();
_dShowPreloader.execute();
}
private function cancelOrder() : Void
{
_dShowPreloader.execute();
_fireEvent(new BasicEvent(EventList.cancelOrderEVENT, view.app.viewOrders.getOrder() ));
}
}
Thanks to this "LEGO Architecture" we have full control over each piece we plug.
From a MovieClipHelper instance we also typically:
- define the Model(s)' callbacks
- broadcast (with our global EventBroadcaster) BasicEvent events or custom events (BasicEvent subclasses) to the commands.
Don't hesitate to extend BasicEvent to make your own custom event objects. It's another cornerstone of Pixlib.
Take a look at the placeOrder() method. You will see how it broadcasts an OrderEvent object.
{
_gotoViewOrders();
_fireEvent(new OrderEvent(EventList.placeOrderEVENT, view.app.order.orderName, view.app.order.orderTicket));
}
Careful, the comparison is unfortunate, but it can helps ARP user to quickly catch the concept :
Think of OrderEvent as a Value Object (VO) that passes the informations to the command.
Okay, you can now cry out loud and clear "Sacrilege" ^^.
II. The FrontController
It's in sushi.commands.Controller (subclass of FrontController) that we associate Events and Commands. Unlike ARP' s ControllerTemplate, the FrontController do not oblige to a direct reference to the views. Less coupling!
FrontController:
{
push ( EventList.placeOrderEVENT, new PlaceOrder() );
push ( EventList.getOrdersEVENT, new GetOrders() );
push ( EventList.cancelOrderEVENT, new CancelOrder() );
}
ControllerTemplate:
{
app.orderForm.addEventListener ( "orderPizza", this );
app.viewOrdersForm.addEventListener ( "getOrderList", this );
app.viewOrdersForm.addEventListener ( "cancelOrder", this );
}
private function addCommands ()
{
addCommand ( "orderPizzaCommand", OrderPizzaCommand );
addCommand ( "getOrderListCommand", GetOrderListCommand );
addCommand ( "cancelOrderCommand", CancelOrderCommand );
}
III. ServiceLocator and Commands
In the Singleton ServiceLocator we define and store one or multiples Remoting service(s) (according to the needs). The alias of each service name is a static variable.
- Remoting service definition
public static var SUSHISERVICE:String = "dejavue_net.sushi.sushiService";
public function init( remotingURL : String ) : Void
{
gatewayURL = "http://www.deja-vue.net/amfphp/gateway.php";
push( ServiceLocator.SUSHISERVICE, ServiceLocator.SUSHISERVICE );
}
- Command configuration
1. Remoting service localization and remote calls.
At the time of writing, the remoting package is still an alpha release. So, I will not enter into the detail of the API.
public function PlaceOrder()
{
_service = ServiceLocator.getInstance().getService( ServiceLocator.SUSHISERVICE );
}
public function execute( e : OrderEvent ) : Void
{
_service.order( new ServiceResponder(this), e.getName(), e.getTicket() );
}
public function onResult( e : BasicResultEvent ) : Void
{
}
public function onFault(e : BasicFaultEvent) : Void
{
}
2. All roads lead to Rome.
And it's here where this is HUGE. From a command (but not only) we can:
- play with any View (remember GraphicLibLocator, MovieClipHelper and ViewHelper).
- broadcast typed events and trigger other commands.
- call the model of our choice
It' s incredible all this control
Last Words (it is time! ^^):
2 days ago, I was obsessed with the idea to write something about the Pixlib's MVC package . At the same time I couldn't stop thinking it was something deadly boring (who except Scotty doesn't know about MVC ?). Digging deeper into the 'events' and 'visual' packages I came across with FrontController and MovieClipHelper. Pixlib didn't finish to amaze me !
Guess who's coming to cook my next project
Hats off to Francis.
Related links:
-MVC and FrontController
http://www.tweenpix.net/blog/index.php?2004/09/22/460-whiteboard-10
Discussion about models in mvc and front controller patterns on Pixlib list
GraphicLib, LibStack and MovieClipHelper
http://www.get-url.net/blog/?47--pixlib-libstack-ou-le-multi-chargement
http://www.get-url.net/blog/?48--pixlib-graphiclib-et-moviecliphelper-vs-movieclip-parti






26 Responses to “ActionStep (plugin View) / Pixlib (MVC FrontController + Remoting) SUSHI Service”
By erixtekila on 2006-05-25 | Reply
Très bon sujet.
Si un jour tu avais le temps de (re)définir les utilisations des patterns FrontController et ModelLocator, je serai ravi.
Un info, depuis swfmill, il est possible de lier une classe avec un clip de façon plus élégante à mon goût. Il suffit d'ajouter un attribut class dans la définition de l'import du . L'association se fait en interne.
Cela permet de configurer l'ensemble depuis le fichier swfmill.
respect
By Mike on 2006-05-26 | Reply
>erixtekila
Très bonne suggestion. Je vais noter ça quelque part dans mon dashboard...
C'est vrai, j'ai été plutôt expeditif sur le FrontController et j'ai fait l'impasse sur le ModelLocator mais le sujet est si riche, il y a beaucoup à couvrir et je ne voulais pas ennuyer avec un trop long billet :D.
Concernant swfmill, tu peux donner un exemple de cette association en interne à laquelle tu fais référence ? Je suis pas sûr de connaitre cette façon là.
By erixtekila on 2006-05-26 | Reply
A vot' service, monseigneur :
… plus loin, l'instanciation :
L'association est crée en interne par swfmill (merci Dan)
By erixtekila on 2006-05-27 | Reply
Est-ce que tu peux développer cette façon que tu as d'instancier les classes ?
Je ne suis pas sûr de comprendre la procédure de l'identifiant utilisé avant d'être initialisé…
By Mike on 2006-05-28 | Reply
Mais je te reconnais ! Le ptit dernier au fond du post là.
On suivait d'une oreille, je vois... ^^.
By erixtekila on 2006-05-28 | Reply
Ouh qu'il est vilain lui !
Ok, je ne me souviendais pûs du post de Dave, mais selon lui :
Alors si t'as pas compris non plus, c'est pas une raison pour embêêêêêter les aut', voilà.
By ekameleon on 2006-05-30 | Reply
Hello
Pour attacher un clip ou un Textfield qui utilise une classe "Custom" pour moi il ne faut pas utiliser la méthode de l'identifiant de liaison dans un attachMovie... cela nécessite de se prendre la tête avec une propriété quelquepart etc....
Le mieux c'est de manipuler le __proto__, j'en parle déjà ICI et ICI
Avec au passage ma classe DisplayFactory qui permet dans VEGAS de faire tout cela proprement
C'est vraiment plus "ECMAScript" comme gestion de l'héritage et surtout moins "obscure" comme on peut le lire au dessus dans la citation ^_^
EKA
By Mike on 2006-05-30 | Reply
Salut EKA :).
Sois le bienvenu !
Je viens de jeter un oeil à Vegas et Asgard. Beau boulot! Il y a du matos...
J'ai pris quelques minutes ce matin pour tester le DisplayFactory sur OSFlash Pizza mais ça ne marche pas pour moi.
navigationForm = NavigationForm(
attachMovie(NavigationForm.id, "navigationForm", 1));
*/
navigationForm = NavigationForm(
DisplayFactory.createChild ( NavigationForm , "navigationForm" , 1, this) );
Un examen avec Xray n'a cependant rien révélé de particulier. La classe est bel et bien instanciée.
By ekameleon on 2006-05-30 | Reply
Hello
Ma classe permet d'utiliser une classe qui hérite de MovieClip et de créer via un createEmptyMovieClip ou un createTextField un clip qui utilise une autre classe que la classe MovieClip pour son héritage.
Tu peux peut être te baser là dessus pour tester ma classe ? 
Je vais voir si je peux pas goupiller un truc automatisé dans Vegas ce soir 

J'ai pas regardé de prêt ton taf, tu utilises des composants compilés ou sont bien totalement dynamiques ? Car sinon faut se méfier
Faudrait que je regarde ce qui cloche ? Peut être avec un exemple à part de ce que tu cherches à faire ? Dans tous les cas tu as du le voir je fourni des exemples avec Asgard et Vegas et on y retrouve dans le répertoire bin/test/vegas/util/factory un exemple d'utilisation
Au passage si tu veux utiliser un composant dans la biblio et lui coller une classe tu peux utiliser la classe ConstructorUtil et la méthode createVisualInstance pour ajouter dynamiquement à ton clip qui vient d'être attaché la classe qu'il faut
EKA
By Mike on 2006-05-30 | Reply
En l'occurence les composants (ActionStep) sont pure ActionScript (l'application est 100% IDE free)
NavigationForm, par exemple, hérite de org.osflash.arp.ArpForm, la classe de base pour toutes les Views d'un projet ARP. ArpForm heritant de MovieClip.
Oui j'ai bien vu les exemples. Les commentaires accompagnants DisplayFactory sont déjà très clairs :).
La classe ConstructorUtil à l'air très intéressante ;). Je regarderai moi aussi tout ça de plus près ce soir.
By ekameleon on 2006-05-30 | Reply
J'ai pas pu résister je viens de mettre en place rapidement dans la clase DisplayFactory une nouvelle méthode attachChild qui permet d'utiliser de façon combinée un attachMovie et la modification de l'héritage, exemple :
// Initialisation du composant
var init = {
t:2 , lc : 0xCCCCCC , la:100 ,
w:50 , h:50 , _x:50 , _y:50
}
var rec:RectangleComponent = DisplayFactory.attachChild( RectangleComponent, "Rectangle", "rec", 1, this, init )
Mais bon dans tous les cas à part cause extrème je préfère créer des composants à base de full dynamique qui font ensuite dans le constructeur de la classe des attachMovie des éléments graphiques si je ne peux pas faire autrement que d'utiliser des symboles dans la biblio

eKA
By erixtekila on 2006-06-02 | Reply
@eka : j'ai toujours privilégié la composition à l'héritage, surtout pour les MovieClip et TextField.
J'utilise par contre dans toutes mes classes sérialiables :
/**
* Liaison de l'objet à sa classe.
* Utiliser "__Packages.packageName" si extension d'un clip dynamique.
*/
public static var linkageID:String = "net.via.ui.GraphicState";
public static var classRef:Function = GraphicState;
public static var className:String = "GraphicState";
/**
* Permet la serialisation d'un objet.
* 1- Relie un objet avec la classe d'où il provient,
* une fois remonté par SharedObject ou échangé par LocalConnection.
* 2- Dans le cas de l'extension d'un MovieClip,
* effectue la liaison avec un graphique généré dynamiquement.
*/
public static var serializable:Boolean = Object.registerClass(linkageID, classRef);
J'ai puisé cela du framework AsUnit et je trouve la méthode très élégante.
Dans Eclipse, j'ai un template qui me génère cela très aisément.
Ainsi, les LocalConnections, SharedObject et services remoting peuvent utiliser simplement une classe personnelisée.
By ekameleon on 2006-06-02 | Reply
Hello
Et du coup je préfère utiliser EDEN pour les objets customs. J'ai posé la question justement aujourd'hui sur FCNG ici.
Alors pour le Object.registerClass je ne m'en sert pas car pour FMS ... les namespace cela ne fonctionne pas correctement coté SSAS
Ensuite pour ce qui est de la composition ou de l'héritage, pour ma part j'utilise les 2 avec des composants qui restent des classes qui héritent de MovieClip (niveau performance c'est mieux à mon avis et cela permet d'aller assez loin dans l'héritage sans se prendre trop la tête) et dans le reste des cas j'utilise une classe DisplayObject qui utilise la composition et qui se calle sur la classe DisplayObject AS3 et ce que l'on peut voir dans Pixlib avec les MovieClipHelper. A mon avis il suffit de faire le bon choix selon la situation
Sinon un truc au passage en voyant ton code au dessus, dans Vegas pour retrouver le nom de la classe et le package de celle ci, j'utilise les méthodes statiques de ma classe ConstructorUtil :
import vegas.events.BasicEvent ;
trace ( "constructor name : " ConstructorUtil.getName(BasicEvent)) ;
trace ( "constructor package : " ConstructorUtil.getPackage(BasicEvent)) ;
trace ( "constructor path : " ConstructorUtil.getPath(BasicEvent)) ;
et cela marche aussi avec les instances :
trace ( "constructor name : " ConstructorUtil.getName(e)) ;
trace ( "constructor package : " ConstructorUtil.getPackage(e)) ;
trace ( "constructor path : " ConstructorUtil.getPath(e)) ;
Du coup à utiliser dans les toString(), les gestions d'erreurs etc.. pas besoin de stocker des static dans la classe pour stocker ces infos également, c'est pratique

EKA
By erixtekila on 2006-06-04 | Reply
D'accord, eka, je vais aller faire un tour dans ton framework. C'est vrai que la réflexion en actionscript c'est une drôle d'affaire...
Si ton ConstructorUtil rempli bien sa tache, je te l'emprunterai.
Pour ma part, j'ai pris la décision de faire hériter toutes les classes de mon travail d'un BasicClass, qui gère notamment les toString, erreurs, et fonctions par défaut (clone, compare...). Si tu fais mieux, j'adopte
Mais par contre, eka, ce qui me manque dans ton travail, c'est son orientation générale.
Je crois depuis le début que vegas == ssas.
Je m'aperçois que ce n'est pas forcément le cas.
Je lis en ce moment "Java, plus simple, plus rapide"
J'ai toujours peur de prendre un framework disproportionné par rapport à mon projet.
Mais le fait de ne pas trop saisir l l'axe de vegas, ne m'a pas aidé.
C'est pareil d'ailleurs pour pixlib que je commence à cerner, ou encore aslib qui rempli tellement de taches que l'on s'y perd.
A mon avis, un framework doit avoir un orientation bien déterminée. S'il répond à plusieurs taches trop disparates, il oblige une utiilsation parcéllaire voire fortuite.
Cela serait dommage de tomber dans les excès des libs java, voir Spring et hibernate comme décision de desighn plutôt que les entreprise java beans.
By Francis Bourre on 2006-06-05 | Reply
Ma révérence à ce billet et son auteur qui ont su cerner les finesses (bluffant!!!) de la partie architecturale de pixlib. Well done mike, renversant !
By ekameleon on 2006-06-05 | Reply
Hello
@erixtekila
Justement Vegas est un framework de base et ensuite tu as des extensions comme Asgard pour gérer tout le reste
Vegas c'est avant tout :
- la base du framework avec le package core
- les structures de données dans le package data (Abstract Data Type) avec les Collections, Map, etc.. qui sont nécessaires pour toute la structure du framework.
- le système événementiel avec le package events
- le système de Log basé sur le système événementiel dans le package logging
- la gestion des erreurs dans le package errors basé sur le système de Log
- Des utilitaires dans le package util et des classes pour manipuler les chaines de caractères dans le package string
J'aurai pu faire à ce niveau là plusieurs "framework" mais tous ces packages se croisent ou nécessitent une dépendance forte à un autre package ! Donc je pense avoir mesurer le minimum vital dans ce Framework et je peux te dire que j'ai fait beaucoup de découpage depuis le début du projet.
Ensuite il est vrai que j'ai presque fini de coder la version SSAS de Vegas car le but au final est d'avoir un framework polymorphe à celui de l'AS3 et qui peut s'utiliser aussi bien dans une application Flash que SSAS ou Javascript (c'est la même chose)
Donc rien de disparatre dans Vegas.. juste ce qu'il faut pour créer une base au niveau des Applications avec tout ce qu'il faut pour rendre homogène le code.
Ensuite tu as par exemple Asgard qui est le framework spécifique à la réalisation d'UI avec des gestionnaires de chargements de données basé sur JSON, EDEN, etc.. avec un package sur les transitions, etc.. etc. mais attention ASGARD lui peut évoluer (là c'est juste une version 0.1) et se diviser ensuite en plusieurs frameworks plus indépendant... il existe déjà une sous extension de Asgard qui se nomme Lunas mais qui arrivera quand Asgard sera stable complètement. Lunas est un framework de composant qui existe aussi pour Pixlib avec le framework Neo...
Bref beaucoup de boulot qui me permet de bien évoluer dans mon code avec peut être d'ici peu un vrai changement d'orientation avec le projet SOLO qui m'intéresse encore plus que ce que je suis en train de faire en ce moment et qui permettrait à une équipe de développeur de créer un framework OpenSource utile pour tout le monde
Il y a assez d'exemple dedans maintenant pour cerner l'essentiel. Ensuite c'est pour moi indispensable d'essayer aussi Pixlib etc... Tout est bon à prendre à mon avis dans le boulot de chacun 

Pour conclure, le mieux, c'est d'utiliser Vegas et ensuite on voit vite ce qu'il permet de faire
EKA
By Xavier MARTIN on 2006-06-14 | Reply
Salut.
Je voulais savoir ou il serait possible de choper la version alpha pour les classes remoting.
Car ton billet est vraiment interressant et je souhaiterai mettre en oeuvre cela ds une api que je dois faire utilisant aussi sushi...
Merci merci
By Xavier MARTIN on 2006-06-14 | Reply
Hope you get the joke above... Rereading it it's not so clear
Anyway, I'm wainting to see those classes... (I hope so)
By Mike on 2006-06-14 | Reply
Salut Xavier,
Tu pourras trouver le package remoting pixlib ici (alpha)
I didn't. Could you try one more time
?
By Xavier MARTIN on 2006-06-15 | Reply
Thx for the link.
Cheers
Nevermind for the joke...
And be prepared, I'm doing an email for the pixlib mailing list dealing with your tuts.
Hope you could clear things a bit
Xavier
By Xavier MARTIN on 2006-06-20 | Reply
Ok I have small question here.
In your tut, in the GetOrders.as command in the onResult function, we're calling the onUpdate function of the Model.
This function in the model is doing nothing else than broadcasting the event onUpdateOrderList to the view regestered.
Just asking if we could skip a step and call the function onUpdateOrderList directly from one of the command.
Why here braodcasting to the model which is braodcasting to the view then???
You don't want to use reference to other view / object ?
By Mike on 2006-06-21 | Reply
True.
As explained in the article, in the command classes you can also use ViewHelper/ MovieClipHelper to interact with your views.
//import com.bourre.core.Model;
//import sushi.models.SUSHIExpert;
//import sushi.models.ModelList;
import com.bourre.visual.MovieClipHelper
import sushi.uis.UIList;
import sushi.uis.SUSHIListUI;
// ... /...
public function onResult( e : BasicResultEvent ) : Void
{
//SUSHIExpert(Model.getModel( ModelList.SUSHI_EXPERT )).onUpdate( e.getResult() );
SUSHIListUI(MovieClipHelper.getMovieClipHelper(UIList.SUSHI_List)).onUpdateOrderList( e.getResult() );
}
Pixlib give us this FLEXibility ;).
I use ModelLocator for the purpose of the article. I wanted to show it in action.
More generally and personally, as a RIA grows, the strategy I would recommend is the ModelLocator strategy. It helps keeping the code disciplined (not mentionned this is the place to store your state).
But It just depends on you personal needs or design choices and the application complexity.
By Marcelo on 2006-08-31 | Reply
Very good article. Thanks for sharing!
By Marcelo on 2006-08-31 | Reply
Just a question: Haven't you made the source files available for download!? I'm searching but can't find it!
By Marcelo on 2006-08-31 | Reply
Ooops... sorry, just found it now