У меня есть одноэлементный класс, который выглядит примерно так (только с более связываемыми общедоступными свойствами):
public class Session extends EventDispatcher
{
private var _Id:String;
private static const _instance:Session = new Session( SingletonLock );
private static const SESSID_CHANGED:String = 'SessionIdChanged';
public function Session( lock:Class ){
//SingletonLock is an empty class not available outside this file
if( lock != SingletonLock ){
throw new Error("Don't instantiate Session. Use Session.instance");
}
_Id = "";
}
public static function get instance():Session{
return _instance;
}
// Changes a blob object (from the server xml for sessions) to a session object
public function updateFromXMLObj(s:ObjectProxy):void
{
_instance.Id = s.Id;
}
[Bindable(event=SESSID_CHANGED)]
public function get Id():String{
return _Id;
}
public function set Id(new_id:String):void{
if(this._Id != new_id){
this._Id = new_id;
this.dispatchEvent(new Event(SESSID_CHANGED));
}
}
public function registerOnSessionChange(listener:Function):void{
addEventListener(SESSID_CHANGED,listener);
}
public function unregisterOnSessionChange(listener:Function):void{
removeEventListener(SESSID_CHANGED,listener);
}
}
Идея состоит в том, что в некотором коде mxml у меня есть выражение привязки данных, подобное следующему:
<mx:HTTPService id="homeReq" url="{URLs.homepath(Session.instance.Id)}" ... />
, где я хочу, чтобы URL для homeReq
обновлялся при изменении sessionId.Кроме того, другие части кода (написанные в Actionscript) должны иметь возможность регистрировать своих слушателей, когда изменяется sessionId, поэтому они вызывают registerOnSessionChange
и unregisterOnSessionChange
для управления этими слушателями.
АномальныйЯ обнаружил, что прослушиватели событий, зарегистрированные через registerOnSessionChange
, действительно вызываются при изменении идентификатора сеанса, но выражение привязки данных MXML не обновляется.Я перепробовал все комбинации отправки события во время фазы захвата и сделал его не подлежащим отмене, но безрезультатно.Мое понимание [Bindable (event = ...)] заключается в том, что MXML должен обновлять строку URL-адреса при отправке указанного события, так что я делаю неправильно или неправильно?
Примечание: я понимаю, что естьмножество разных способов сделать шаблон синглтона в Actionscript, но если способ, которым я это делаю, действительно как-то вызывает мою проблему, я был бы признателен, если бы не отвлекался от обсуждения альтернатив.