AS3分离不同项目的数组

时间:2016-05-23 21:06:32

标签: arrays list actionscript-3 associative-array

我有一个在关联数组中创建新值的函数。

var array:Array = new Array(new Array());
var i : int = 0;

function personVelgLand(evt:MouseEvent)
{
    for(i = 0; i < personListe.dataProvider.length; i++)
    {
        if(txtPersonVelg.text == personListe.dataProvider.getItemAt(i).label)
        {
            personListe.dataProvider.getItemAt(i).reise = array;
            personListe.dataProvider.getItemAt(i).reise.push(landListe.selectedItem.land);
        }
    }
}

发生的事情是&#39;阵列&#39;变成&#39; personListe.dataProvider.getItemAt(i).reise&#39;适用于列表中的每个项目。我想要它,以便每次运行该函数时,.reise仅适用于所选项目而不是所有项目。

编辑:

我这样做了:

personListe.dataProvider.getItemAt(i).reise = new Array(array);

现在它们不一样但现在列表中的每个项目都不能有多个.reise值......

编辑2:没有它,dataProvider没有任何效果。 .reise是在我最初发布的函数中创建的,它在对象.reise中创建getItemAt(i)

personListe是用户通过使用输入文本字段添加自己的项目的列表。它由这个函数给出:

function regPerson(evt:MouseEvent)
{
    regPersoner.push(txtRegPerson.text);

    personListe.addItem({label:regPersoner});

    regPersoner = new Array();
    txtRegPerson.text = "";
}

编辑3:用户可以注册转到列表中标签的名称。还列出了3个国家,西班牙,葡萄牙和英国。然后,用户可以将国家注册到他们选择的人。那就是当我想在&#34;名称&#34;内创建.reise时第一个列表中包含所选国家/地区的项目。我希望每个名称都能够选择多个国家,然后将在包含其名称的项目内的元素.reise中创建。如果我可以使用字符串,这将很容易。但是后来我计划让用户输入一个国家/地区,然后显示每个用户选择该国家/地区的内容。这就是为什么这些国家需要作为数组存储在&#34; name&#34;项..

1 个答案:

答案 0 :(得分:2)

您应首先为正在建模的User数据创建一个类。你已经知道了所有的属性。

  
      
  • 用户可以注册名称

  •   
  • 然后,用户可以将国家注册到他们选择的人。

  •   
  • 能够选择多个国家/地区

  •   

这样的课程看起来像这样:

package
{
    public class User
    {
        private var _name:String;
        private var _countries:Array;

        public function User(name:String)
        {
            _name = name;
            _countries = [];
        }

        public function get name():String
        {
            return _name;
        }

        public function get countries():Array
        {
            return _countries;
        }

        public function set countries(value:Array):void
        {
            _countries = value;
        }
    }
}

现在创建一个DataProvider,用该类的对象填充它并将其用于列表as described here

import fl.controls.List; 
import fl.data.DataProvider; 

var users:List = new List(); 

users.dataProvider = new DataProvider([
                            new User("David"), 
                            new User("Colleen"), 
                            new User("Sharon"), 
                            new User("Ronnie"), 
                            new User("James")]); 

addChild(users); 
users.move(150, 150);

要从User对象获取标签,请定义labelFunction

import fl.controls.List; 
import fl.data.DataProvider; 

var users:List = new List(); 

users.labelFunction = userLabelFunction;

function userLabelFunction(item:Object):String 
{
    return  item.name;
}

users.dataProvider = new DataProvider([
                            new User("David"), 
                            new User("Colleen"), 
                            new User("Sharon"), 
                            new User("Ronnie"), 
                            new User("James")]); 

addChild(users); 
users.move(150,150);

这样您就不必在班级中添加您不想要的label属性。

选择名称意味着选择用户。与该名称相关联的国家/地区列表应显示在第二个List

DataProvider的{​​{1}}保持不变,列出了所有可用的国家/地区。

List

现在你所要做的就是把它连接起来。如果选择了用户,请在国家/地区列表中选择他的国家/地区。如果选择了某个国家/地区,请将其添加到当前所选用户的国家/地区列表中这可能看起来像这样:

import fl.controls.List; 
import fl.data.DataProvider; 


// list of users

var users:List = new List(); 
addChild(users); 
users.move(150,150);

users.labelFunction = userLabelFunction;

function userLabelFunction(item:Object):String 
{
    return  item.name;
}

users.dataProvider = new DataProvider([
                            new User("David"), 
                            new User("Colleen"), 
                            new User("Sharon"), 
                            new User("Ronnie"), 
                            new User("James")]); 


// lsit of countries

var countries:List = new List(); 
addChild(countries); 
countries.move(550,150); // adjut position as desired

countries.dataProvider = new DataProvider([
                            {label:"a"}, 
                            {label:"b"}, 
                            {label:"c"}, 
                            {label:"d"}, 
                            {label:"e"}, 
                            {label:"f"}]); 

完整代码可能如下所示。我没有测试过这个,但你明白了。

users.addEventLsitener(Event.CHANGE, onUserSelected);

function onUserSelected(e:Event):void
{
    countries.selectedItems = users.selectedItem.countries;
}

countries.addEventLsitener(Event.CHANGE, onCountrySelected);

function onCountrySelected(e:Event):void
{
    users.selectedItem.countries = countries.selectedItems;
}
  

根据我的理解,除了在程序启动时已经提供名称的事实外,这似乎有效。我想要的是用户在程序运行时自己添加名称。

您可以使用// list of users var users:List = new List(); addChild(users); users.move(150,150); users.labelFunction = userLabelFunction; function userLabelFunction(item:Object):String { return item.name; } users.dataProvider = new DataProvider([ new User("David"), new User("Colleen"), new User("Sharon"), new User("Ronnie"), new User("James")]); // list of countries var countries:List = new List(); addChild(countries); countries.move(550,150); // adjut position as desired countries.dataProvider = new DataProvider([ {label:"a"}, {label:"b"}, {label:"c"}, {label:"d"}, {label:"e"}, {label:"f"}]); // events users.addEventLsitener(Event.CHANGE, onUserSelected); function onUserSelected(e:Event):void { countries.selectedItems = users.selectedItem.countries; } countries.addEventLsitener(Event.CHANGE, onCountrySelected); function onCountrySelected(e:Event):void { users.selectedItem.countries = countries.selectedItems; } 类提供的方法添加新项目,例如DataProvider。只需添加新的addItem()个对象。