Flex 4 и Actionscript 3 создают элементы формы на основе количества выбранных элементов - PullRequest
0 голосов
/ 06 марта 2012

Итак, у меня есть элемент управления списком, который я установил для allowMultipleSelection ... по сути, я пытаюсь создать форму для создания текстового ввода для каждого элемента, который я выбрал в своем списке ... работая так, когда я выбираю первый элемент, он добавляет вход формы, но когда я выбираю второй элемент, он добавляет два входа формы и сохраняет первый вход формы, получая три итога ... очевидно, вместо того, чтобы просто добавить их, я просто хочу его чтобы быть обновленным, я также запутался, как бы я справился с отменой выбора элемента и обновлением формы ... вот мой код и спасибо за любую помощь заранее.

protected function multipleFormulaListChangeHandler(event:Event):void {
            var numberSelected:uint = multFormulaList.selectedItems.length;
            trace(numberSelected);
            for(var i:int = 0; i < numberSelected; i++) {
                var formitem:FormItem = new FormItem;
                var forminput:TextInput = new TextInput;
                formitem.addElement(forminput);
                theform.addElement(formitem);
            }
        }

Ответы [ 2 ]

1 голос
/ 06 марта 2012

У меня были отличные результаты при использовании mx.collections.ArrayCollection и mx.collection.IViewCursor для подобных ситуаций.

Использование ArrayCollection (что являетсяпо сути, ассоциативный массив) вы можете отслеживать, какие элементы в настоящий момент выбраны, сохраняя сами элементы:

private var currSelected:ArrayCollection = new ArrayCollection();

protected function multipleFormulaListChangeHandler(event:Event):void {
    var numberSelected:uint = multFormulaList.selectedItems.length;
    for each(var item:Object in multFormulaList.selectedItems) {
        //add item to currSelected AC
        currSelected.addItem(item);
    }
}

Чтобы предотвратить введение дубликатов и всей причины даже упоминания курсоров или коллекций массивов в первомplace - вы также создадите курсор представления для того, что сейчас является вашей коллекцией массивов выбранных элементов, и использовали бы метод findAny () этого курсора (чтобы предотвратить дальнейшее зацикливание), чтобы установить существование элемента в вашей коллекции массивов выбранных элементов.Установите в условной форме внутри цикла, который вы сейчас делаете, вы получите что-то вроде этого:

    import mx.collections.ArrayCollection;
import mx.collections.IViewCursor;

import mx.collections.Sort;
import mx.collections.SortField;

private var currSelected:ArrayCollection = new ArrayCollection();
//Be sure to run a sort on currSelected because cursors can only be created on sorted array collections
/*
    var sort:Sort = new Sort();
    sort.fields = [new SortField(null, true)];
    currSelected.sort = sort;

*/

protected function multipleFormulaListChangeHandler(event:Event):void {
    //create cursor 
    var cursor:IViewCursor = currSelected.createCursor();
    //loop through selected items list comparing each looped item with the currSelected array for matches
    for each(var item:Object in multFormulaList.selectedItems) {
        if(!cursor.findAny(item)){
            //no match found - add item to currSelected AC and create form field 
            currSelected.addItem(item);
            //for add logic
            var formitem:FormItem = new FormItem;
            var forminput:TextInput = new TextInput;
            formitem.addElement(forminput);
            theform.addElement(formitem);
        }else{
            //match found - not adding
        }

    }
}
0 голосов
/ 06 марта 2012

Если ваши элементы известны, может быть лучше справиться с этим через свойства visible и includeInLayout элементов вашей формы.

Однако, если вы хотите полного динамизма, я бы сохранил ассоциативный массив (Object) где вы храните, какие предметы уже были включены в вашу форму.Ваше событие должно проверить этот объект перед созданием и добавлением их снова.

Когда вы отмените выбор элемента, просто удалите его из формы и удалите из объекта ассоциативного массива.

Допустим, вашАссоциативный массив называется alreadyShown.Единственное, что вам нужно сделать внутри вашего кода:

if(alreadyShown[idOfTheItemYouWantToAdd]!=1){
  /*
  paste the code that adds your item here
  */
  alreadyShown[idOfTheItemYouWantToAdd] = 1
}

Когда вы удаляете свой элемент, вы должны установить alreadyShown[idOfTheItemYouWantToAdd] в 0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...