Arrays 如何使用用户提供的信息更新文本区域中输出的已经存在的数组?

Arrays 如何使用用户提供的信息更新文本区域中输出的已经存在的数组?,arrays,actionscript-3,flash,Arrays,Actionscript 3,Flash,我声明了两个独立的数组,其中每个数组的对应索引是关于一个人的“信息” var alderArr: Array = [45, 34, 18, 12, 27]; var navnArr: Array = ["N. Linjesæter", "P. Kurverud", "O. Sirkelstad", "J. Rektangelsen", "M. Ellipsen"]; 然后,我还有两个不同的输入字段,用户可以在其中输入信息,这些信息将在按下按钮btnLeggTill时添加到数组中。而且数组似乎根

我声明了两个独立的数组,其中每个数组的对应索引是关于一个人的“信息”

var alderArr: Array = [45, 34, 18, 12, 27];
var navnArr: Array = ["N. Linjesæter", "P. Kurverud", "O. Sirkelstad", "J. Rektangelsen", "M. Ellipsen"];
然后,我还有两个不同的输入字段,用户可以在其中输入信息,这些信息将在按下按钮
btnLeggTill
时添加到数组中。而且数组似乎根据
跟踪(alderArr+“\n”+navnArr)

btnLeggTil.addEventListener(MouseEvent.CLICK,leggTil);
功能leggTil(evt:MouseEvent){
var nyttNavn:String=txtNavn.text;
var nyAlder:int=int(txtAlder.text);
//跟踪(nyttNavn+nyAlder);调试
奥尔德拉尔推(nyAlder);
导航推力(nyttNavn);
跟踪(alderArr+“\n”+navnArr);
}//leggTil()
对于(变量i:int=0;i
但是文本区域中的信息似乎没有更新。这基本上就是我想要完成的。我希望这样,当用户输入新信息并在数组中添加新内容时,textArea也会更新,以便向用户显示此信息

我声明了两个独立的数组

虽然它确实完成了任务,但还远远不够理想。将属于多个数据结构的数据拆分意味着您必须使两个阵列保持同步

为数据建模的更好方法是为其创建一个类。这并不太难,一个明显的名字应该是
Person
。根据您的代码,一个人有两个属性:
年龄
姓名
。将以下内容保存到名为
Person.as
的文件中以开始

package
{
    public class Person
    {
        private var name:String;
        private var age:int;

        public function Person(name:String, age:int)
        {
            this.name = name;
            this.age = age;
        }
    }
}
优点是可以对给定的参数执行各种健全性检查,并且可以向其添加各种功能

说到功能,添加一个
toString()
方法,该方法返回对象的
String
表示形式

package
{
    public class Person
    {
        private var name:String;
        private var age:int;

        public function Person(name:String, age:int)
        {
            this.name = name;
            this.age = age;
        }

        public function toString():String
        {
            return name + ", Alder: " + age;
        }
    }
}
您可以使用该类创建对象,这些对象可以传递到
trace()
,以便根据上述函数将它们作为
字符串输出:

var person:Person = new Person("Jack", 35);

trace(person);   //Jack, Alder: 35
现在你可以有一个
数组
对象。这更直观。但是
数组
有一个问题

但是文本区域中的信息似乎没有更新

的确如此。
TextArea
是一个相当简单的组件。为了清楚起见,我们在这里讨论的是Flash的

它或多或少只是一个
文本字段
。它无法询问数组是否已更新(例如,添加了元素),而
数组
也无法告诉任何人它已更新

这个问题通常通过使用
数组
以外的东西来解决,该数组可以判断它是否刚刚被更改。一个能够做到这一点的类是
数据提供者

将对象存储在主时间轴上的
数据提供程序中,而不是将
人员
对象存储在
数组
中:

var people:DataProvider = new DataProvider();

people.addItem(new Person("Jack", 35));
people.addItem(new Person("Jane", 20));
people.addItem(new Person("Charlie", 25));

for (var i:int = 0; i < people.length; ++i)
{
    trace(people.getItemAt(i));
}
若要通知其他人有关数据更改的信息,
DataProvider
将发送类型为
data\u change
fl.events.datachangevent
。为该事件添加侦听器,以相应地更新
TextArea

var people:DataProvider = new DataProvider();

people.addEventListener(DataChangeEvent.DATA_CHANGE, onDataChange);

function onDataChange(e:DataChangeEvent):void
{
    textArea.text = people.toArray().join("\n");
}

people.addItem(new Person("Jack", 35));
people.addItem(new Person("Jane", 20));
people.addItem(new Person("Charlie", 25));
无论何时从
数据提供程序中添加(或删除)某些内容,都会触发事件并更新
textArea
。在您的代码中,这可能如下所示:

var people:DataProvider = new DataProvider();
people.addEventListener(DataChangeEvent.DATA_CHANGE, onPeopleDataChanged);

function onPeopleDataChanged(e:DataChangeEvent):void
{
    textArea.text = people.toArray().join("\n");
}

addPersonButton.addEventListener(MouseEvent.CLICK, addPerson);
function addPerson(e:MouseEvent):void
{
    people.addItem(new Person(nameInput.text, int(ageInput.text)));
}
我更改了您的变量名。在编程中始终使用英语标识符。在不知道leggTil是什么的情况下阅读代码是一件非常痛苦的事情。如果您向internet上的人寻求帮助,请使用英语。 如果在理解你的代码之前,我必须先想出精灵语的“朋友”这个词,那么我很可能会在帮助你之前被一只巨大的章鱼吃掉。让你的代码尽可能容易理解符合你自己的利益

还要注意的是,我删除了局部变量。不需要它们,它们只会使代码膨胀。通过
Person
类中的功能,代码现在非常纤细。它几乎读起来像人类语言:“向具有给定姓名和年龄的新人添加项目”


TextArea
相比,
DataProvider
在其他类中工作得更好。
在我的回答中,我只演示了如何使
数组
更智能。但是还有一些类似于
TextArea
的东西也更智能。一些组件可以直接传递给
数据提供程序
。它们将侦听器添加到自身中,并在
数据提供程序
更改。如果您不必明确使用
TextArea
,我建议您使用
ComboBox
DataGrid
List
TileList
组件。

如您所说,在更新数组时,您必须将
for
循环放入
leggTil()中,以更新文本区域
函数,当然,在更新之前不要忘记重置文本区域,使用:
textArea.text='';
..@akmozo是的,谢谢。只是有点不确定如何继续操作,尝试了许多不同的方法来让它工作,但忽略了前面提到的简单方法。再次感谢:DI查看了DataProv以前是IDER,但个人没有那么多使用它们的经验。对“编码”和actionscript相对较新,并试图掌握一些东西。但这肯定是我将仔细研究的东西,看看代码如何以这种方式看起来更清晰、更合逻辑。感谢您的帮助。
var people:DataProvider = new DataProvider();

people.addEventListener(DataChangeEvent.DATA_CHANGE, onDataChange);

function onDataChange(e:DataChangeEvent):void
{
    textArea.text = people.toArray().join("\n");
}

people.addItem(new Person("Jack", 35));
people.addItem(new Person("Jane", 20));
people.addItem(new Person("Charlie", 25));
var people:DataProvider = new DataProvider();
people.addEventListener(DataChangeEvent.DATA_CHANGE, onPeopleDataChanged);

function onPeopleDataChanged(e:DataChangeEvent):void
{
    textArea.text = people.toArray().join("\n");
}

addPersonButton.addEventListener(MouseEvent.CLICK, addPerson);
function addPerson(e:MouseEvent):void
{
    people.addItem(new Person(nameInput.text, int(ageInput.text)));
}