我如何使用用户提供的信息更新 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
。根据您的代码,一个人有两个属性:age
和 name
。将以下内容保存到名为 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
现在您可以拥有 单个 Array
个 Person
个对象。这更直观。但是 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
,我建议使用 ComboBox
、DataGrid
、List
或 TileList
组件。 Here's an article on how to make them work with a DataProvider
我声明了 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
。根据您的代码,一个人有两个属性:age
和 name
。将以下内容保存到名为 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
现在您可以拥有 单个 Array
个 Person
个对象。这更直观。但是 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
,我建议使用 ComboBox
、DataGrid
、List
或 TileList
组件。 Here's an article on how to make them work with a DataProvider