Découverte du framework Robotlegs [3/5]

La couche Model


Commençons le développement par la couche la plus basse et la plus basse, la couche de Model, qui charge les données et les stocke pour leur usage au sein de l’application. Voici le XML de contenu :

<?xml version="1.0" encoding="utf-8" ?>
<data>
	<entry file="img/placeholder-00.png">
		<title><![CDATA[lorem ipsum]]></title>
	</entry>
	<entry file="img/placeholder-01.png">
		<title><![CDATA[sit dolor est]]></title>
	</entry>
	<entry file="img/placeholder-02.png">
		<title><![CDATA[ consectetur adipiscing elit]]></title>
	</entry>
</data>


On a un seul type de données à stocker dans une structure séquentielle de type liste. Nous allons stocker chaque entrée dans un type personnalisé correspondant à cette structure. C’est un pattern de Value Object, nommons ce type le type Entry.

package model.vo
{
	public class Entry
	{

		public var file : String;
		public var title : String;

	}

}

Construisons maintenant la classe DiaporamaData, dont le rôle sera :

  • charger un fichier XML,
  • stocker les données : ici dans un Vector.
  • passer à l’image suivante : dispatcher le nom du fichier de l’image suivante à charger, et cycler à l’infini
  • passer à l’image précédente : dispatcher le nom du fichier de l’image précédente à charger, et cycler à l’infini
package model
{
	import controller.events.DiaporamaEvent;
	import model.vo.Entry;	

	import org.robotlegs.mvcs.Actor;

	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.events.Event;
	import flash.events.IOErrorEvent;	

	public class DiaporamaData extends Actor
	{

		private var _entries : Vector.<Entry>;
		private var _current : uint = 0;

		public function DiaporamaData()
		{
			super();
		}

		public function load( url : String = 'diaporama-content.xml' ) : void
		{
			var content : URLLoader = new URLLoader();
			content.addEventListener( Event.COMPLETE, onComplete );
			content.addEventListener( IOErrorEvent.IO_ERROR, onIOError );
			content.load( new URLRequest(url) );
		}

		private function onComplete( e : Event ) : void
		{
			_entries = new Vector.<Entry>();

			var content : XML = new XML((e.target as URLLoader).data);
			for each( var entryData : XML in content.entry ) {
				var entry : Entry = new Entry();
				entry.file = entryData.@file;
				entry.title = entryData.title;
				_entries.push(entry);
			}

			eventDispatcher.dispatchEvent( new DiaporamaEvent( DiaporamaEvent.CONFIG_COMPLETE, false, false, _entries[_current] ) );
		}

		public function next() : void
		{
			if ( _current + 1 < _entries.length ) {
				_current++;
			} else {
				_current = 0;
			}

			eventDispatcher.dispatchEvent( new DiaporamaEvent( DiaporamaEvent.REFRESH, false, false, _entries[_current] ) );
		}

		public function previous() : void
		{
			if ( _current - 1 >= 0 ) {
				_current--;
			} else {
				_current = _entries.length - 1;
			}

			eventDispatcher.dispatchEvent( new DiaporamaEvent( DiaporamaEvent.REFRESH, false, false, _entries[_current] ) );
		}

		private function onIOError( e : IOErrorEvent ) : void
		{
			throw new Error( 'content could not be loaded' );
		}

		public function get entries() : Vector.<Entry>
		{
			return _entries;
		}

	}

}

C’est là tout ce dont nous avons besoin pour cette application. Le Model est généralement ce qu’il y a de plus facile : on expose quelques méthodes publiques, on émet simplement un/des événements selon l’état du Model.

Cette entrée a été publiée dans Actionscript 3, Flash Platform, Flex, avec comme mot(s)-clef(s) , , , , . Vous pouvez la mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>