AS3 分离不同项目的数组

AS3 Separating Arrays for different items

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

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);
        }
    }
}

发生的事情是 'array' 数组变为 'personListe.dataProvider.getItemAt(i).reise' 应用于列表中的每个项目。我想要它,以便每次运行函数时,.reise 仅适用于所选项目,而不适用于所有项目。

编辑:

我这样做了:

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

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

编辑 2:dataProvider 没什么,没有它也能正常工作。 .reise 是在我最初发布的函数中创建的,它在对象 getItemAt(i).

中创建 .reise

personListe 是一个列表,用户可以使用输入文本字段向其中添加自己的项目。它由这个函数给出:

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

    personListe.addItem({label:regPersoner});

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

编辑 3:用户可以注册名称,这些名称会变成列表中的标签。还有 3 个国家/地区的列表,西班牙、葡萄牙和英国。然后用户可以为他们 select 的人注册一个国家。那就是当我想在第一个列表中的 "name" 项目中创建 .reise 时,该列表包含他们 selected 的国家/地区。我希望每个名称都能够 select 多个国家/地区,然后将在包含其名称的项目内的元素 .reise 中创建这些国家/地区。如果我可以使用字符串,这会很容易。但后来我计划让用户输入一个国家,然后显示每个用户对该国家进行 select 访问的内容。这就是为什么需要将国家/地区存储为 "name" 项中的数组的原因..

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

  • The user can register names

  • The user can then register a country to a person they select.

  • able to select multiple countries

这样的 class 可能如下所示:

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,用 class 的对象填充它并将它用于列表 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);

这样您就不必在 class.

中添加您不想要的 label 属性

选择一个名字意味着select一个用户。与名称关联的国家/地区列表应在第二个 List.

中显示

ListDataProvider 保持不变,即所有可用国家/地区的列表。

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"}]); 

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

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;
}

From what I understand this seems to work except for the fact that the names are already provided when the program starts. What I want is that the user adds the name themselves while the program is running.

您可以使用 DataProvider class 提供的方法添加新项目,例如 addItem()。只需添加新的 User 个对象。