2015-09-03 2 views
0

У меня есть Flex mx:ViewStack, у которых есть некоторые дочерние элементы Flex, но я хочу добавить больше с помощью ActionScript.ActionScript: программное добавление дочерних элементов в `mx: ViewStack`

var o:MyCanvas = new MyCanvas; 
o.id = 'modRipley'; 
viewStack.addChild(o); 
o = new MyCanvas; 
o.id = 'modNewt'; 
viewStack.addChild(o); 
o = new MyCanvas; 
o.id = 'modGorman'; 
viewStack.addChild(o); 

Пошаговое, я не вижу никакой прибавки к childDescriptors члена (ни _childDescriptors) и:

viewStack.getChildByName('modNewt'); 

просто возвращает нуль.

Я использую SDK Flex 3.5.

+1

addChild верен, но я бы не ожидал, что childDescriptors изменится, потому что это описывает детей mxml. Я также не ожидал, что getChildByName будет работать в вашем случае, потому что вы не дали дочернему имени. – Aaron

ответ

3

Вместо того, чтобы назначать o.id = 'modNewt';, используйте o.name = 'modNewt'; и попробуйте получить доступ к ребенку с помощью viewStack.getChildByName('modNewt');. Он должен работать.

+0

Или просто сохраните ссылку на дочерний элемент и не используйте 'getChildByName' вообще ... – Aaron

+0

Я знал, что' id' был одним из тех хоккейных элементов Flex, которые не могли нормально обрабатываться в AS, но это все, что я знал. Благодарю. – Opux

1

Как и в моем комментарии, использование addChild верное, но ваш другой код не пригодится. childDescriptors - это то, что использует инфраструктура Flex для создания MXML-файлов, поэтому ожидается, что она не будет отражать динамические изменения, сделанные в ActionScript. И getChildByName требует, чтобы у ребенка было значение name, в то время как вы не дали им name, вы дали им id.

Как правило, если я хочу динамически добавлять просмотр детей, я делаю то, что делает MXML-компилятор с дочерними элементами MXML: создайте свойства, которые будут относиться к детям при их создании. Например:

public class Example extends SomeMxmlComponentWithViewStack { 
    public var myCanvas1:MyCanvas; 
    public var myCanvas2:MyCanvas; 
    public var myCanvas3:MyCanvas; 

    override protected function createChildren():void { 
     super.createChildren(); // creates the MXML children 
     viewStack.addChild(myCanvas1 = new MyCanvas()); 
     viewStack.addChild(myCanvas2 = new MyCanvas()); 
     viewStack.addChild(myCanvas3 = new MyCanvas()); 
    } 
} 

Теперь из любого кода, вы можете обратиться к myCanvas1, myCanvas2 и myCanvas3. Это то, что делает компилятор MXML для вас, когда вы объявляете компонент в MXML и даете ему id.

+0

+1 для объяснения того, как правильно обрабатывать дочерние экземпляры в ActionScript. (они не обязательно должны быть общедоступными, если вам нужны только эти ссылки внутри компонента.) – karfau

+0

Если я правильно вас понимаю, я не думаю, что это сработает для меня, потому что у вас, похоже, есть «MyCanvas», созданные на в то же время, что и «ViewStack». Во время создания создаются несколько из файлов «ViewStack», но моему приложению необходимо добавить и удалить детей с помощью выполнения. (Подумайте об этом, я должен, вероятно, выяснить, как их удалить) – Opux

+0

Конечно, вам не нужно делать это внутри 'createChildren' (это был только пример), вы можете создавать и удалять, когда захотите , Главное, что у вас есть свойства, чтобы ссылаться на ваших детей (ex 'myCanvas1 и т. Д.), Чтобы вы не потеряли их или вам нужно использовать уязвимые функции поиска для поиска детей. – Aaron

Смежные вопросы