переопределение сеттера в компонентах MXML в Adobe Flex - PullRequest
1 голос
/ 15 декабря 2011

Я пытаюсь переопределить установщик текста в компоненте Label, но иногда он ведет себя странно, иногда super.text работает, а иногда нет!и следы показывают, что нет ошибки с моим кодом.

вот мой код:

import spark.components.Label;

public class LabelXX extends Label
{
    private var _initialText:String;
    private var _assignedText:String;
    public function LabelXX()
    {
        super();
    }

    override public function set text(value:String):void
    {
        if (!_initialText)
        {
            _initialText = value;
            super.text = value;
            trace("initial text = " + value);
        }else
        {
            _assignedText = value;
            super.text = _initialText + " " + _assignedText;
            trace("Now: " + _initialText + " " + _assignedText);
        }
        //this wont have any effect no matter what I do:
        //super.text = "test test test";
    }

    override public function get text():String
    {
        if (!_assignedText)
        {
            return "";
        }else
        {
            return _assignedText;
        }
    }

}

ОБНОВЛЕНИЕ: если я комментирую геттер, он работает нормально, который все еще не работаетне имеет никакого смысла!

спасибо

1 Ответ

1 голос
/ 15 декабря 2011

Скорее всего, метод super get / set обращается к некоторой закрытой переменной, которая содержит значение свойства. Ваш расширенный класс не имеет доступа к этой закрытой переменной. Переопределив метод get, чтобы никогда не вызывать super; при использовании его в методе set вы можете столкнуться со странностями. Особенно если что-либо в родительском объекте обращается к закрытой переменной и обходит методы get / set. К сожалению, это иногда случается в коде Flex Framework. Итак, я мог бы попытаться переработать ваш код примерно так:

private var _initialText:String;
private var _assignedText:String;

    override public function set text(value:String):void
    {
        if (!_initialText)
        {
            _initialText = value;
            super.text = value;
            trace("initial text = " + value);
        }else
        {
            _assignedText = value;
// change here to reference value not _assignedText
            super.text = _initialText + " " + value;
            trace("Now: " + _initialText + " " + value);
        }
        //this wont have any effect no matter what I do:
        //super.text = "test test test";
    }

    override public function get text():String
    {
        if (!_assignedText)
        {
            return "";
        }else
        {
// change here to reference super.text not _assignedText
            return super.text;
        }
    }
...