views:

135

answers:

2

Hi everyone, out of curiosity I decided to experiment with the following in a Flex 4 project:

public class MyGroup extends Group
{       
    public function MyGroup()
    {
        super();
        var myLabel:Label = new Label();
        myLabel.id = "myLabel";
        myLabel.text = "My label!";
        this.addElement(myLabel);
    } etc.

This custom component does what I'd expect; it looks like a label control with text="My label!".

Question: is there any way to reference the myLabel label control (e.g. to change the text) elsewhere in the project?

At the moment the only way I can get to the inner label control is by calling something like myGroup.getElementAt(0).

I realize that it would make more sense to have the label be a class variable -- I'm just wondering how this code works.

+2  A: 

You can make a public setter to change you text label:

public class MyGroup extends Group
{
    private var _label:Label=new Label();

    public function set label(value:String):void{
      _label.text=value;
    }

    public function MyGroup()
    {
        super();
        _label.id = "myLabel";
        label = "My label!";
        addElement(_label);
    }
.....
}

var myGroup:MyGroup=..
myGroup.label="Hello";

In your case since you are declaring your var myLabel inside a function, it 's scope will only apply inside this function

Patrick
A: 

In ActionScript, variables are named handles that you can pull on to get objects and data. Variables have something called scope, which specifies in what parts of the code the handle is valid.

When you create a variable inside a function, its scope is that function. That is, that particular named handle is only usable inside that function.

In your code, you create a handle called myLabel, and put a Label in it--let's call it Label123. Next you put Label123 into the element list of MyGroup, which gives MyGroup a handle attached to Label123. Then the function ends, and the handle called myLabel is no longer usable. Label123 still exists, because MyGroup has a handle to it.

If you create myLabel as a private or protected class variable, that handle will be usable from any function inside MyGroup. If you create it as a public class variable, it will be usable anywhere inside MyGroup, and also anywhere in the code you have an instance of MyGroup. (And if you create it as an internal class variable, it will be usable anywhere inside the package MyGroup is in.)

Selene