2012-03-18 33 views
0

我知道有作为getElementByName Flex中没有这样的功能,但我也现在你可以做到这一点[“OBJECT_ID”]获取应用程序你就像的元素英寸 什么里面得到一个元素另一个元素? 我试过制作element["id"]?但是在我的try-catch中,它总是运行“catch”部分= \ 所以:我如何在另一个元素中获取一个元素,并将它的id设置为动态创建的字符串形式?的Flex getElementByName

预先感谢您

回答

3

这取决于你试图访问什么样的元素。

  1. 子显示对象可以通过调用DisplayObjectContainer#getChildByName访问:
    element.getChildByName("name");

  2. 公共变量(其可以被设置成也包含一个子显示对象)可通过使用bracket syntax访问:
    element["name"];

    ,或者干脆利用dot syntaxelement.name

(其中name是您尝试访问的属性的名称)。

请注意,如果您在导出设置中选中了“自动声明阶段实例”选项,则任何您拖动到Flash IDE中的舞台的实例都将为automatically be assigned to a public variable。这就是使用this[name]的原因。

+0

我谈论FLEX这里,没有舞台等等。我也在谈论UIComponent对象,它没有孩子,但元素。仅供参考,我现在正在使用TabNavigator。 – 2012-03-18 16:43:36

+0

那么,这是很好的信息 - 也许你应该在下次你的问题时加上这个。无论如何,请查看UIComponent和* tada *的信息:它是DisplayObjectContainer的子类... http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObjectContainer.html#getChildByName () – weltraumpirat 2012-03-18 23:43:05

+0

而仅供参考它*有*有孩子。 – weltraumpirat 2012-03-18 23:43:45

0

如果我理解正确,您需要一种方法来获取具有特定名称的Flex应用程序中的所有“元素”。

下面是一个例子(Flex 3的):

<?xml version="1.0"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*"> 
    <mx:Script> 
    <![CDATA[ 
     private function testIt():void 
     { 
     var arr:Array = getDisplayObjectsByName(this, "foo"); 
     for each (var e:* in arr) 
      trace(e); 
     } 

     private static function getDisplayObjectsByName(node:DisplayObjectContainer, 
      name:String, recurse:Boolean = true):Array 
     { 
     var n:int = node.numChildren; 
     var a:Array = []; 
     for (var i:int = 0; i < n; i++) { 
      var c:DisplayObject = node.getChildAt(i); 
      if (c.name == name) 
      a.push(c); 

      if (recurse) { 
      if (c is DisplayObjectContainer) 
       a = a.concat(getDisplayObjectsByName(DisplayObjectContainer(c), 
        name, true)); 
      } 
     } 

     return a; 
     } 
    ]]> 
    </mx:Script> 
    <mx:VBox name="foo"> 
    <mx:HBox> 
     <mx:Button name="foo" label="Test" click="testIt()" /> 
    </mx:HBox> 
    </mx:VBox> 
    <mx:Label text="Ignore Me" /> 
    <mx:VBox name="bar"> 
    </mx:VBox> 
</mx:Application> 

在这里,我们正在寻找一切所谓的“富”,当用户点击“测试”按钮的元素。

输出:

main0.foo 
main0.foo.HBox5.foo 

你会发现,getDisplayObjectsByName()static。它所做的只是遍历显示列表(深度优先),并挑选出具有指定名称的所有对象。

+0

我现在没有可能测试它,但我提前感谢你!顺便说一下,我只想在第一级儿童中获得“foo”元素。所以只是VBox =)我认为我只需要删除最后一条if语句,对吧? ;) – 2012-03-19 09:19:57

+0

@AndreaSilvestri我已将名称更改为“getDisplayObjectsByName”,以反映我们正在寻找“DisplayObject”而不是“元素”(如XML元素)的事实,并且还添加了一个'recurse'参数,它在默认情况下是'true'。 – Manish 2012-03-19 17:59:59

0

如果你在一个Group寻找元素,您可以使用此功能:

static function getElementByName(group:GroupBase, name:String):IVisualElement { 
    const child:DisplayObject = group.getChildByName(name); 
    const index:int = group.getChildIndex(child); 
    return group.getElementAt(index);    
}