Привязываемая функция получения единичного экземпляра, никогда не вызываемая в выражении привязки данных - PullRequest
0 голосов
/ 26 октября 2011

У меня есть одноэлементный класс, который выглядит примерно так (только с более связываемыми общедоступными свойствами):

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, но если способ, которым я это делаю, действительно как-то вызывает мою проблему, я был бы признателен, если бы не отвлекался от обсуждения альтернатив.

Ответы [ 2 ]

0 голосов
/ 28 октября 2011
  1. Создайте форму MXML, содержащую комбинированный список для номера курса 5-го семестра. При выборе предложения отобразите название курса и максимальные оценки для выбранного курса. Привязка данных: <mx:Binding>
0 голосов
/ 26 октября 2011

Я думаю, что {URLs.homepath (Session.instance.Id)} это не привязка к переменной, а выполнение метода объекта, вы пытались сделать что-то вроде этого:

[Bindable]
private var _url:*

Затем установите начальное значение _url при инициализации или завершите:

_url = {URLs.homepath(Session.instance.Id)};

Связывание с переменной в MXML

<mx:HTTPService id="homeReq" url="{_url}" ... />

Затем обновление _urlпеременная должна автоматически обновлять URL HTTPService ...

...