我如何使用用户提供的信息更新 textArea 中输出的现有数组?

How can i update the already exsistant array that is outputed in the textArea with info given by the user?

我声明了 2 个单独的数组,其中每个数组的相应索引是 "information" 关于一个人。

var alderArr: Array = [45, 34, 18, 12, 27];
var navnArr: Array = ["N. Linjesæter", "P. Kurverud", "O. Sirkelstad", "J. Rektangelsen", "M. Ellipsen"];

然后我还有 2 个不同的输入字段,用户可以在其中输入信息,当按下按钮 btnLeggTill 时,这些信息将被添加到数组中。数组似乎根据 trace(alderArr + "\n" + navnArr)

更新
btnLeggTil.addEventListener(MouseEvent.CLICK, leggTil);
function leggTil(evt:MouseEvent) {

    var nyttNavn: String = txtNavn.text;
    var nyAlder: int = int(txtAlder.text);
    //trace(nyttNavn + nyAlder);                            Debug
    alderArr.push(nyAlder);
    navnArr.push(nyttNavn);
    trace(alderArr + "\n" + navnArr);                                   
}//leggTil()

for (var i:int = 0; i < alderArr.length; i++) {

    textArea.text += navnArr[i] + ", Alder: " + alderArr[i] + "\n";
}//for

但是textArea中的信息好像没有更新。这基本上是我想要完成的。我想这样做,以便当用户输入新信息并在数组中添加新内容时,textArea 也会更新,以便将此信息显示给用户。

I have 2 seperate arrays declared

虽然它确实可以完成工作,但远非理想。将属于多个数据结构的数据拆分意味着您必须使两个数组保持同步。

为数据建模的更好方法是为其创建 class。这并不难,一个明显的名字是 Person。根据您的代码,一个人有两个属性:agename。将以下内容保存到名为 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() 方法,其中 returns 对象的 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;
        }
    }
}

您可以使用 class 创建对象,根据上述函数可以将其传递给 trace() 以将它们输出为 String

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

trace(person);   //Jack, Alder: 35

现在您可以拥有 单个 ArrayPerson 个对象。这更直观。但是 Array...

有问题

But the information does not seem to update in the textArea

没错。 TextArea 是一个相当简单的组件。在此澄清一下,我们谈论的是 Flash 的 fl.controls.TextArea.

它或多或少只是一个 TextField。它无法询问数组是否已更新(例如,添加了一个元素)并且 Array 无法告诉任何人它已更新。

问题通常通过 Array 以外的东西来解决,它可以判断它是否刚刚被更改。 class 能够做到这一点的是 DataProvider,特别是 fl.data.DataProvider.

不是将 Person 个对象存储在 Array 中,而是将它们存储在主时间轴上的 DataProvider 中:

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

这会添加一些虚拟数据并使用 for 循环来 trace() 所有项目。 要更轻松地将元素连接到字符串,您还可以从 DataProvider 获取 Array 表示并调用其 join() 方法:

var people:DataProvider = new DataProvider();

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

trace(people.toArray().join("\n"));

为了通知其他人有关数据的更改,DataProvider 调度了 DATA_CHANGE 类型的 fl.events.DataChangeEvent。为该事件添加一个侦听器以相应地更新 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));

每当您从 DataProvider 添加(或删除)某些内容时,事件就会触发并更新 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 是什么的情况下阅读代码是一件很痛苦的事情。如果您向互联网上的人寻求帮助,请使用英语。 如果我在理解你的代码之前必须首先想出朋友这个精灵词,那么我很可能会在能够帮助你之前被一只巨大的章鱼吃掉。让您的代码尽可能易于理解符合您自己的利益。

另请注意,我删除了局部变量。没有真正需要它们,它们只会使代码膨胀。有了 Person class 中的功能,代码现在真的很苗条。它几乎读起来像人类语言:“向人添加一个项目,这是一个具有给定姓名和年龄的新人


TextArea 相比,DataProvider 与其他 class 一起使用效果更好。 在我的回答中,我只演示如何让 Array 更聪明。但是还有其他类似于 TextArea 的东西也更聪明。一些组件可以直接传递 DataProvider。他们将侦听器添加到自己,并连接功能以在 DataProvider 更改时更新其文本。如果您没有明确必须使用 TextArea,我建议使用 ComboBoxDataGridListTileList 组件。 Here's an article on how to make them work with a DataProvider