2011-04-26 92 views
1

所以,我回来了更多与我的Flash应用程序有关的问题。AS3在点击事件中获取textField.text

我有一个成功的几个影片剪辑列表,即“MiniInfos”,包含一些“作品”的一些细节。这些被添加到一个循环中的阶段,并且每次我需要添加一个eventlistener(MouseEvent.CLICK)以便能够单击它以显示更多细节。问题是,要知道接下来应该出现哪些细节,我需要访问包含ID的TextField,以便将它传递给下一个Movieclip(可以称之为“BigInfo”)。

所以,我知道这听起来很混乱,但生病尝试总结。

有几个MiniInfos添加到舞台上与TextField的像 “ID:1,ID:2,ID:3” 等

我希望能够点击一个又一个影片剪辑(BigInfo)获取添加到舞台上更多的细节。要知道哪些信息我应该拉上PHP,我需要知道我点击的MiniInfo的ID。

我IDEIA(没有工作)为:

//on the cycle 
MiniInfo.addEventListener(MouseEvent.CLICK, OpenWorkDetails); 

//further down the code 
public function OpenWorkDetails(e:MouseEvent):void 
     { 
     trace(MiniInfo.IDTrabalhoField.text); 
     //If I figure this number out, I will change it to addChild 
     } 

所以,我得到一个错误1120:未定义的属性MiniInfo的访问。

我意识到这个代码并不是最好的,所以如果你们有一个不同的解决方案,随时分享。我仍然学习闪光灯。

谢谢。

马克福克斯。

回答

2

我创建了一个小型闪存应用程序来展示不同的方法可以采取:

FLASH

Main.as(文档类):

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.MouseEvent; 
    import flash.net.URLLoader; 
    import flash.net.URLRequest; 
    import flash.net.URLRequestMethod; 
    import flash.net.URLVariables; 

    [SWF(width="275", height="175")] 
    public class Main extends Sprite 
    { 
     private var _phpPath:String = "http://localhost/stackoverflow/minibiginfos/getBigInfo.php"; 
     private var _bigInfo:BigInfo; 

     public function Main():void 
     { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 

     }// end function 

     private function init(e:Event = null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 

      var xml:XML = <miniInfos> 
           <miniInfo id="1" text="Mini Info 1" /> 
           <miniInfo id="2" text="Mini Info 2" /> 
           <miniInfo id="3" text="Mini Info 3" /> 
          </miniInfos>; 

      for (var i:uint = 0; i < xml.children().length(); i++) 
      { 
       var miniInfo:MiniInfo = new MiniInfo(xml.miniInfo[i][email protected], 
                xml.miniInfo[i][email protected]); 

       miniInfo.x = 25; 
       miniInfo.y = 25 + ((miniInfo.height + 25) * i); 
       addChild(miniInfo); 

       miniInfo.addEventListener(MouseEvent.CLICK, onMiniInfoClick); 

      }// end for 

     }// end function 

     private function onMiniInfoClick(e:MouseEvent):void 
     { 
      loadBigInfo(MiniInfo(e.currentTarget).id); 

     }// end function 

     private function loadBigInfo(id:int):void 
     { 
      if (!_bigInfo) 
      { 
       _bigInfo = new BigInfo(); 
       _bigInfo.x = 150; 
       _bigInfo.y = 25; 
       addChild(_bigInfo); 

      }// end if 

      var urlVariables:URLVariables = new URLVariables(); 
      urlVariables.miniInfoID = id; 

      var urlRequest:URLRequest = new URLRequest(_phpPath); 
      urlRequest.method = URLRequestMethod.POST; 
      urlRequest.data = urlVariables; 

      var urlLoader:URLLoader = new URLLoader(urlRequest); 
      urlLoader.addEventListener(Event.COMPLETE, onURLLoaderComplete); 
      urlLoader.load(urlRequest); 

     }// end function 

     private function onURLLoaderComplete(e:Event):void 
     { 
      var urlLoader:URLLoader = URLLoader(e.currentTarget); 

      var urlVariables:URLVariables = new URLVariables(urlLoader.data); 

      _bigInfo.text = urlVariables.text; 


     }// end function 

    }// end class 

}// end package 

import flash.display.Sprite; 
import flash.text.TextField; 

internal class MiniInfo extends Sprite 
{ 
    private var _id:int; 
    private var _text:String 
    private var _width:Number = 100; 
    private var _height:Number = 25; 

    override public function get width():Number { return _width } 
    override public function get height():Number { return _height } 
    public function get id():int { return _id } 
    public function get text():String { return _text } 

    public function MiniInfo(id:int, text:String):void 
    { 
     _id = id; 
     _text = text; 

     graphics.beginFill(0xE1E1E1); 
     graphics.drawRect(0, 0, _width, _height); 
     graphics.endFill(); 

     var textField:TextField = new TextField(); 
     textField.x = textField.y = 5; 
     textField.text = text; 
     textField.mouseEnabled = false; 
     addChild(textField); 

    }// end function 

}// end class 

internal class BigInfo extends Sprite 
{ 
    private var _width:Number = 100; 
    private var _height:Number = 125; 
    private var _textField:TextField; 

    public function get text():String { return _textField.text } 
    public function set text(text:String):void { _textField.text = text; } 

    public function BigInfo() 
    { 
     graphics.beginFill(0xE1E1E1); 
     graphics.drawRect(0, 0, _width, _height); 
     graphics.endFill(); 

     _textField = new TextField(); 
     _textField.width = 90; 
     _textField.wordWrap = true; 
     _textField.x = _textField.y = 5; 
     _textField.mouseEnabled = false; 
     addChild(_textField); 

    }// end function 

}// end class 

PHP

getBigInfo。PHP:

<?php 

    if(!empty($_POST)) 
    { 
     $bigInfos = array 
        (
         array 
         (
          'miniInfoID' => 1, 
          'text' => "This is the big info for mini info 1" 
         ), 
         array 
         (
          'miniInfoID' => 2, 
          'text' => "This is the big info for mini info 2" 
         ), 
         array 
         (
          'miniInfoID' => 3, 
          'text' => "This is the big info for mini info 3" 
         ) 
        ); 

     $text; 

     for($i = 0; $i < sizeof($bigInfos); $i++) 
     { 
      foreach($bigInfos as $item) 
      { 
       if($item['miniInfoID'] == (int)$_POST['miniInfoID']) 
       { 
        $text = $item['text']; 
        break; 
       } 

      }// end foreach 

      break; 

     }// end for 

     print "text=$text"; 

    }// end if 

?> 

以下是闪光灯应用程序运行的一个图像:

minibiginfos flash application

1
public function OpenWorkDetails(e:MouseEvent):void{   
    trace((e.currentTarget as MiniInfo).IDTrabalhoField.text); 
} 
+0

错误:1119:通过与静态类型MiniInfo参考可能未定义的属性IDTrabalhoField的访问。 我需要导入一些东西吗? – FoxLift 2011-04-26 13:33:21

+0

@Marco Fox - 什么是miniinfo? IDTrabalhoField如何在那里声明? – www0z0k 2011-04-26 13:41:42

+0

IDTrabalhoField是名为MiniInfo的MovieClip中的动态文本字段(正确命名为IDTrabalhoField,我知道它的工作原理,因为我之前使用过)。这个miniInfo在一段时间内通过addChild添加到舞台中。所有这些都在“容器”MovieClip中。 我知道它的混乱,所以生病图表更好: MainSWF.swf> Container.as> MiniInfo(影片剪辑) – FoxLift 2011-04-26 13:46:09

0

你肯定MainFInfo,你MainINfo.addEventListener和OpenWOrkDetails都在同一个影片剪辑?

您正在收到的错误意味着MainInfo不存在于同一个MovieClip中。 lee

0

您的问题可能是MiniInfo未在范围内声明。如果它是一个类实例,那么它会起作用,但是如果在函数内部声明了MiniInfo,那么只要退出该函数,它就会“被遗忘”。这就是为什么你必须做www0z0k做的事情,并使用事件的currentTarget属性。

+0

MiniInfo doesent有一个AS文件,如果我做一个为了它,它会开始工作吗? – FoxLift 2011-04-26 13:40:26