2010-10-05 2 views
0

Значения xml хранятся в коллекции массива «arr». в зависимости от длины сохраненного массива, создаются нижеописанные компоненты и динамически назначают эти значения соответствующим компонентам.Назначение значений Xml динамически созданным компонентам

Для примера:

AdvanceSearch.mxml является одним из компонентов, а другая компонента, как advanceSearchAtom.mxml. внутри «advanceSearchAtom» есть некоторые субкомпоненты, такие как текстовое поле, поле со списком и т. д. мы можем добавить many advanceSearchAtom.mxml внутри 'AdvanceSearch.mxml'.

var container : AdvanceSearch; 

var adv : advanceSearchAtom; 

for(var i:int=0;i<arr.length;i++) { 
    adv = new advanceSearchAtom(); 

    adv.field.text = arr[i].field; 
    adv.value.selectedIndex = arr[i].value; 

    container.addChild(adv); 
} 

Пожалуйста, дайте мне знать, если кто-нибудь столкнется с этой проблемой. если какая-либо соответствующая ссылка заметна. Заранее спасибо

ответ

0

Вы не упоминали об этом, но я думаю, проблема в том, что вы получаете нулевую ссылочную ошибку (1009) по следующим направлениям:

adv.field.text = arr[i].field; 
adv.value.selectedIndex = arr[i].value; 

Я прав?

Это потому, что field и value еще не созданы. В соответствии со стандартным экземпляром компонента Flex создает дочерние элементы только тогда, когда это необходимо - то есть, когда оно должно отображаться.

Вы можете либо прослушать событие creationComplete компонента AdvanceSearchAtom и обновить значения оттуда; или имеют Binadble общедоступные переменные в классе AdvanceSearchAtom, привяжите их к field.text и value.selectedIndex и присвойте значения xml этим переменным в цикле.

Используя полное создание:

public var container:AdvanceSearch; 
public var searchItems:Array = []; 
public var arr:Array; 

//assuming that arr has been initialized with xml values. 
var adv:AdvanceSearchAtom; 
for(var i:int=0;i<arr.length;i++) { 
    adv = new AdvanceSearchAtom(); 
    adv.addEventListener(FlexEvent.CREATION_COMPLETE, onAtomCreated); 
    container.addChild(adv); 
    searchItems.push(adv); 
} 

public function onAtomCreated(e:Event):void 
{ 
    var adv:AdvanceSearchAtom = e.currentTarget as AdvanceSearchAtom; 
    if(!adv) 
     return; 
    var index:Number = searchItems.indexOf(adv); 
    adv.field.text = arr[index].field; 
    adv.value.selectedIndex = arr[index].value; 
} 

Использование связывания данных:

Внутри AdvanceSearchAtom.mxml

<mx:TextInput id="field" text="{textValue}"/> 
<mx:ComboBox id="value" selectedIndex="{comboIndex}"/> 

В блоке сценарного AdvanceSearchAtom.mxml

[Bindable] 
public var textValue:String; 

[Bindable] 
public var comboIndex:Number; 
var adv:AdvanceSearchAtom; 

В классе AdvanceSearch:

for(var i:int=0;i<arr.length;i++) { 
    adv = new AdvanceSearchAtom(); 
    container.addChild(adv); 
    adv.field.text = arr[i].field; 
    adv.value.selectedIndex = arr[i].value; 
} 
+0

Благодарим за этот замечательный ответ. Надеюсь, это поможет мне решить мою проблему. Большое спасибо. – raj