Цитата:
Сообщение от Babylon
На самом деле удобно иметь несколько контроллеров для вида, модели и глобальный для ядра.
В глобальном лучше размещать основные команды ядра. Контроллер вида обслуживает виджеты,
а контроллер модели сервисы. Скелет вида, модели и контроллер команд, у меня естественно XML, ноды которого передаются в соответствующие конструкторы дисплей контейнеров вида , которые затем рендерятся виджетами. Соответственно вся иерархия в виде графа, который агрегатирован по parent id соответствующей xml ноды.
Нода вида
...
Нода Коллекция виджетов
.....
Нода Коллекция команд и хэндлеров
....
Нода Коллекция сервисов
|
Имеется ввиду что вся структура программы генерируется на основании подгружаемого XML? Если да, для меня пока это будет сложно повторить но про перспективы возможности можно только догадываться )
Пока написал вот это

Код AS3:
package {
import flash.display.Sprite;
import me.inpictures.Controller;
import flash.events.Event;
public class InPictures extends Sprite {
public function InPictures() {
addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
var controller:Controller = new Controller(stage,this);
}
}
}
Controller - главный контроллер

Код AS3:
package me.inpictures {
import me.inpictures.worker.Framework;
import me.inpictures.worker.app.Auth;
import me.inpictures.worker.app.Registration;
import me.inpictures.worker.amf.AMF
import me.inpictures.data.User;
import flash.events.Event;
import flash.display.DisplayObjectContainer;
import flash.display.Stage;
import me.inpictures.worker.GetFlashVars;
import me.inpictures.worker.api.SocialNetwork;
public class Controller {
private var _stage:Stage;
private var _user:User;
private var framework:Framework;
private var _model:Model = new Model();
private var _viewer:Viewer = new Viewer(_model);
private var _container:DisplayObjectContainer;
public function Controller(stage:Stage, container:DisplayObjectContainer)
{
_stage = stage;
_container = container;
init();
}
private function init():void {
_container.addChild(_viewer);
_model.addEventListener(Model.PAGE_UPDATE, pageUpdate);
new AMF('http://dev.net/app/Amfphp/');
_user = new User();
framework = new Framework();
framework.addTask(new GetFlashVars(_stage,_user));
framework.addTask(new SocialNetwork(_user));
framework.addTask(new Auth(_user,_model));
framework.run();
}
private function pageUpdate(e:Event):void {
switch (_model.page )
{
case Model.PAGE_REGISTRATION:
new Registration(_user,_model).run();
break;
}
}
}
}
Model - главная модель

Код AS3:
package me.inpictures {
import flash.events.Event;
import flash.events.EventDispatcher;
public class Model extends EventDispatcher {
public static var UPDATE:String = 'update';
public static var PAGE_UPDATE:String = 'page_update';
public static var PAGE_REGISTRATION:String = 'page_registration';
private var _page:String = 'default';
public function Model() {
}
public function get page():String {
return _page;
}
public function setPage(page:String):void {
_page = page;
dispatchEvent(new Event(PAGE_UPDATE));
}
}
}
Viewer - главный вьювер ( пока не используется, работаю пока только с данными)

Код AS3:
package me.inpictures {
import flash.events.Event;
import flash.display.Sprite;
public class Viewer extends Sprite {
private var _model:Model;
public function Viewer(model:Model) {
_model = model;
_model.addEventListener(Model.UPDATE, update );
}
private function update(e:Event):void {
trace('>>>update');
}
}
}
User - модель пользователь ( черновая версия )

Код AS3:
package me.inpictures.data {
import flash.events.EventDispatcher;
import flash.events.Event;
public class User extends EventDispatcher {
public static var NEW_USER:String = 'new_user';
private var _systemId:uint = 0;
private var _uid:uint = 0;
private var _network:String = 'unbrowse';
public function User() {
_network = 'vk';
}
public function get sid():uint {
return _systemId;
}
public function get uid():uint {
return _uid;
}
public function sign(data:*):Object {
var send:Object = new Object();
if ( data is Object || data is Array) {
var ind:String;
for ( ind in data) {
send[ind] = data[ind];
}
send.sign = true;
} else if (data is String) {
send.string = data;
} else send.sign = false;
return send;
}
public function get simple():Object {
var data:Object = new Object();
data.uid = uid;
data.network = _network;
return data;
}
public function setFlashVars(data:Object):void {
if (!_uid) _uid = (data.viewer_id) ? uint(data.viewer_id) : 16580191;
}
public function auth(data:Object):void {
_systemId = (_systemId) ? _systemId : uint(data.uid.sys);
if (data.registration) dispatchEvent(new Event(User.NEW_USER));
for ( var i in data) {
trace( i + " >> "+data[i]);
for ( var ii in data[i]) {
trace(' >> '+ii+' >> '+data[i][ii]);
}
}/***/
}
public function get all():Object {
var data:Object = new Object();
data.sys = _systemId;
data.uid = uid;
data.network = _network;
data.first_name = _first_name;
data.last_name = _last_name;
data.sex = _sex;
data.nickname = _nickname;
data.photo = _photo;
data.bday = _bday;
data.city = _city_id;
data.country = _country_id;
return data;
}
public function socialAuth(data:Array):void {
if (data.length && _uid == data[0].uid) {
_nickname = data[0].first_name;
_sex = data[0].sex-1;
_realname = data[0].first_name+" "+data[0].last_name;
_first_name = data[0].first_name;
_last_name = data[0].last_name;
if (data[0].bdate) {
if (data[0].bdate.length>0) {
var r = data[0].bdate.split(".");
r[0] = (r[0]) ? r[0] : "1";
r[1] = (r[1]) ? r[1] : "1";
r[2] = (r[2]) ? r[2] : "1950";
r[0] = (r[0]<10) ? "0"+r[0] : r[0];
r[1] = (r[1]<10) ? "0"+r[1] : r[1];
_bday = r[2]+" "+r[1]+" "+r[0];
} else _bday = "1950 01 01";
} else _bday = "1950 01 01";
_photo = data[0].photo_big;
_city_id = (data[0].city) ? data[0].city : 0;
_country_id = (data[0].country) ? data[0].country : 0;
}
}
private var _first_name:String = '';
private var _last_name:String = '';
private var _bday:String = '';
private var _nickname:String = '';
private var _sex:Number = 0;
private var _realname:String = '';
private var _photo:String = '';
private var _city_id:uint = 0;
private var _country_id:uint = 0;
}
}
"Внутренние" контроллеры

Код AS3:
package me.inpictures.worker {
import flash.display.Stage;
import flash.events.Event;
import me.inpictures.data.User;
public class GetFlashVars extends Worker {
public function GetFlashVars(stage:Stage, _user:User) {
_user.setFlashVars(stage.loaderInfo.parameters as Object);
dispatchEvent(new Event(Event.COMPLETE));
}
}
}

Код AS3:
package me.inpictures.worker.app {
import flash.events.Event;
import me.inpictures.Model;
import me.inpictures.data.User;
import me.inpictures.worker.Worker;
import me.inpictures.worker.amf.AMF;
public class Auth extends Worker {
private var _user:User;
private var _model:Model;
public function Auth(user:User , model:Model) {
_user = user;
_model = model;
if (!_user.hasEventListener(User.NEW_USER))
_user.addEventListener(User.NEW_USER, newUser );
}
private function newUser(e:Event):void {
_model.setPage(Model.PAGE_REGISTRATION);
_user.removeEventListener(User.NEW_USER, newUser);
}
override public function run():void {
AMF.call('User/auth', _user.auth, _user.simple );
dispatchEvent(new Event(Event.COMPLETE));
}
}
}

Код AS3:
package me.inpictures.worker.app {
import me.inpictures.data.User;
import me.inpictures.Model;
import me.inpictures.worker.Worker;
import me.inpictures.worker.amf.AMF;
public class Registration extends Worker {
private var _user:User;
private var _model:Model;
public function Registration(user:User , model:Model) {
_user = user;
_model = model;
}
override public function run():void {
AMF.call('User/registration', _user.auth, _user.all );
}
}
}
Подправьте если ушел не в ту степь