AS3将变量参数传递给通用函数菜单/子项

时间:2012-07-30 16:53:45

标签: actionscript-3 events variables drop-down-menu parameter-passing

我不是代码天才,而是动作脚本的粉丝。 你能帮我解决这个问题:

我有一个函数,根据所选对象,将调用事件监听器到一组已经在舞台上的“子项”(我想在点击时重复使用这个子项和更改的参数,而不是创建多个实例和几个代码)。

因此,对于每个选定的“案例”,我必须将不同的变量传递给那些“子项”,如下所示:

function fooMenu(event:MouseEvent):void {
    switch (event.currentTarget.name)
    {
        case "btUa1" :
            trace(event.currentTarget.name);
            // a bunch of code goes here
            //(just cleaned to easy the view)
            /*
            HELP HERE <--
            here is a way to pass the variables to those subitems
            */

            break;
    }
}

function fooSub(event:MouseEvent):void
{
    trace(event.target.data);
    trace(event.currentTarget.name);
    // HELP PLEASE <-> How can I access the variables that I need here ?
}

btUa1.addEventListener(MouseEvent.CLICK, fooMenu);
btUa2.addEventListener(MouseEvent.CLICK, fooMenu);

btTextos.addEventListener(MouseEvent.CLICK, fooSub);
btLegislacao.addEventListener(MouseEvent.CLICK, fooSub);

有人帮我吗? 非常感谢提前。 :)

2 个答案:

答案 0 :(得分:1)

(我不确定我的问题是否正确,而且我还没有在AS3中开发一段时间。)

如果你想简单地创建带有参数的函数,这些参数将在点击(或其他事件)时被调用,你可以简单地使用它:

btUa1.addEventListener(MouseEvent.CLICK, function() {
  fooMenu(parameters);
});

btUa2.addEventListener(MouseEvent.CLICK, function() {
  fooMenu(other_parameters)
}):

public function fooMenu(...rest):void {
  for(var i:uint = 0; i < rest.length; i++)
  {
     // creating elements
  }
}

如果要调用分配给其他内容的事件侦听器,可以使用DispatchEvent

btnTextos.dispatchEvent(new MouseEvent(MouseEvent.CLICK))

请记住,你不能使用btTextos.addEventListener(MouseEvent.CLICK,carregaConteudo(“jocasta”));因为在添加Eventlistener时传递的第二个参数将被视为函数本身 - 有两种正确的方法可以使用addEventListener:

1:

function doSomething(event:MouseEvent):void
{
  // function code
}
element.addEventListener(MouseEvent.CLICK, doSomething); //notice no brackets

2:

element.addEventListener(MouseEvent.CLICK, function() { // function code });

所以:

function fooSub(event:MouseEvent, bla:String):void 
{ 
trace(event.currentTarget.name+" - "+bla); 
// bla would be a clip name. 
} 

codebtTextos.addEventListener(MouseEvent.CLICK, function(e:MouseEvent) { fooSub(e, "jocasta") } ); 

如果您想要动态生成内容,请尝试使用此类内容:

btUa1.addEventListener(MouseEvent.CLICK, function() {
    createMenu(1);
});

btUa2.addEventListener(MouseEvent.CLICK, function() {
    createMenu(2);
});

function createMenu(id):void
{
    // Switching submenu elements
    switch (id)
    {
        case 1:
            createSubmenu([myFunc1, myFunc2, myFunc3]); // dynamically creating submenus in case you need more of them than u already have
            break;
        case 2:
            createSubmenu([myFunc4, myFunc5, myFunc6, myFunc7]);
            break;
        default:
            [ and so on ..]
    }
}

function createSubmenu(...rest):void {
    for (var i:uint = 0; i < rest.length; i++) 
    {
        var mc:SubItem = new SubItem(); // Subitem should be an MovieClip in library exported for ActionScript
        mc.addEventListener(MouseEvent.CLICK, rest[i] as function)
        mc.x = i * 100;
        mc.y = 0;
        this.addChild(mc);
    }
}

答案 1 :(得分:0)

你的问题很模糊;什么&#34;变量&#34;你想&#34;通过&#34;?那是什么意思&#34;将变量传递给子项&#34;?通常&#34;通过&#34;意味着调用一个函数。

如果您可以更具体地了解您尝试做什么,那将会有所帮助。与此同时,这里有三件事可以达到你想要的目的:

您可以使用括号表示法获取任何对象的任何成员。

var mc:MovieClip = someMovieClip;  
var xVal:Number = mc.x;     // The obvious way
xVal = mc["x"];             // This works too
var propName:String = "x";
xVal = mc[propName] ;       // So does this.

您可以使用变量

来引用函数
function echo(message:String):void { 
    trace(message); 
}
echo("Hello");                      // The normal way
var f:Function = echo; 
f("Hello");                         // This also works

您可以使用function.apply

调用包含数组中所有参数的函数
// Extending the above example...
var fArgs:Array = ["Hello"];
f.apply(fArgs);    // This does the same thing

在这三件事之间(以及另一张海报上注明的rest参数),您可以编写一些非常灵活的代码。动态代码确实具有性能成本,但只要呼叫频率为每秒几百次或更少,您就不会注意到差异。