我有一个单例类,看起来大致像这样(只有更多可绑定的公共属性):
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)}" ... />
我希望homeReq
的url在sessionId更改时更新。此外,代码的其他部分(用Actionscript编写)需要能够在sessionId更改时注册侦听器,因此它们调用registerOnSessionChange
和unregisterOnSessionChange
来管理这些侦听器。
我发现的异常行为是,通过registerOnSessionChange
注册的事件侦听器确实在会话Id更改时被调用,但MXML数据绑定表达式没有更新。我尝试了在捕获阶段调度事件的所有组合,并使其不可取消,但无济于事。我对[Bindable (event=…)]的理解是,当指定的事件被分派时,MXML应该更新url字符串,所以我做错了或误解了什么?
注意:我意识到在Actionscript中有很多不同的方法来做单例模式,但除非我这样做实际上是在某种程度上导致我的问题,否则我很感激不要通过讨论替代方案而偏离方向。
我认为{url .homepath(Session.instance.Id)}这不是绑定到一个变量,而是执行一个对象的方法,你有没有试过这样做:
[Bindable]
private var _url:*
然后在init或complete时设置初始值为_url:
_url = {URLs.homepath(Session.instance.Id)};
链接到MXML中绑定的变量
<mx:HTTPService id="homeReq" url="{_url}" ... />
那么更新_url变量应该会自动更新HTTPService的url…
- 制作一个MXML表单,其中包含第五学期课程编号的组合框。在选择课程时,显示课程名称和所选课程的最高分数。数据绑定:
<mx:Binding>