单例实例的可绑定getter函数永远不会在数据绑定表达式中被调用

时间:2011-10-26 17:56:23

标签: actionscript-3 flex data-binding

我有一个类似于此的单例类(只有更多可绑定的公共属性):

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

我发现的异常行为是,当会话ID发生变化时,确实正在调用通过registerOnSessionChange注册的事件监听器,但MXML数据绑定表达式未更新。我已尝试在捕获阶段调度事件的所有组合,并使其不可取消,但无济于事。我对[Bindable(event = ...)]的理解是MXML应该在调度指定的事件时更新url字符串,那么我做错了什么或误解了什么?

注意:我意识到在Actionscript中有很多不同的方法来处理单例模式,但除非我这样做的方式实际上是以某种方式引起我的问​​题,否则我不会因为讨论替代方案而陷入困境。

2 个答案:

答案 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)

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