决不在数据绑定表达式中调用的单例实例的可绑定getter函数



我有一个单例类,看起来大致像这样(只有更多可绑定的公共属性):

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更改时注册侦听器,因此它们调用registerOnSessionChangeunregisterOnSessionChange来管理这些侦听器。

我发现的异常行为是,通过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…

  1. 制作一个MXML表单,其中包含第五学期课程编号的组合框。在选择课程时,显示课程名称和所选课程的最高分数。数据绑定:<mx:Binding>

最新更新