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