我有一个类似于此的单例类(只有更多可绑定的公共属性):
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)}" ... />
我希望在sessionId更改时更新homeReq
的网址。此外,代码的其他部分(用Actionscript编写)需要能够在sessionId更改时注册其侦听器,因此他们调用registerOnSessionChange
和unregisterOnSessionChange
来管理这些侦听器。
我发现的异常行为是,当会话ID发生变化时,确实正在调用通过registerOnSessionChange
注册的事件监听器,但MXML数据绑定表达式未更新。我已尝试在捕获阶段调度事件的所有组合,并使其不可取消,但无济于事。我对[Bindable(event = ...)]的理解是MXML应该在调度指定的事件时更新url字符串,那么我做错了什么或误解了什么?
注意:我意识到在Actionscript中有很多不同的方法来处理单例模式,但除非我这样做的方式实际上是以某种方式引起我的问题,否则我不会因为讨论替代方案而陷入困境。
答案 0 :(得分:0)
我认为{URLs.homepath(Session.instance.Id)}这不是绑定到变量而是执行对象的方法,你尝试过这样的事情:
[Bindable]
private var _url:*
然后在初始或完成时将初始值设置为_url:
_url = {URLs.homepath(Session.instance.Id)};
链接到MXML中的绑定变量
<mx:HTTPService id="homeReq" url="{_url}" ... />
然后更新_url变量应该自动更新HTTPService url ...
答案 1 :(得分:0)
<mx:Binding>