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

Posted

技术标签:

【中文标题】如何使用用户提供的信息更新在 textArea 中输出的现有数组?【英文标题】:How can i update the already exsistant array that is outputed in the textArea with info given by the user? 【发布时间】:2016-09-20 15:34:30 【问题描述】:

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

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 也将被更新,以便向用户显示此信息。

【问题讨论】:

正如您已经说过的,在更新数组时,您必须通过将 for 循环放在 leggTil() 函数中来更新文本区域,当然,不要忘记重置您的使用更新之前的文本区域:textArea.text = ''; ... @akmozo 是的,谢谢。只是有点不确定我将如何继续这样做,尝试了许多不同的品种来尝试让它工作,但忽略了提到的简单方法。再次感谢:D 【参考方案1】:

我声明了 2 个单独的数组

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

为数据建模的更好方法是为其创建一个类。这不是太难,一个明显的名字是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() 方法,该方法返回对象的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(),以根据上述函数将它们输出为String

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

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

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

但textArea中的信息似乎没有更新

确实如此。 TextArea 是一个相当简单的组件。为了清楚起见,我们谈论的是 Flash 的fl.controls.TextArea

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

该问题通常通过使用Array 以外的其他东西来解决,它可以判断它是否刚刚被更改。能够做到这一点的一类是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 调度了 fl.events.DataChangeEvent 类型的 DATA_CHANGE。为该事件添加一个侦听器以相应地更新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 类中的功能,现在的代码真的很精简。它几乎读起来像人类语言:“向人们添加一个项目,该项目是具有给定姓名和年龄的新人


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

【讨论】:

我之前看过一些 DataProviders,但个人没有太多使用它们的经验。 “编码”和动作脚本相对较新,并试图掌握一些东西。但这绝对是我将仔细研究的事情,看看代码如何以这种方式变得更加清晰和合乎逻辑。感谢您的帮助。

以上是关于如何使用用户提供的信息更新在 textArea 中输出的现有数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何实时更新 TextArea 的输入?

HTML:如何在 textarea 中保留格式?

如何在不按下按钮的情况下自动处理 <textarea> 的内容?

php MySQL 更新表 textarea html

如何使用servlet更新用户信息mysql

如何使用 c# 获取 HTML <textarea> 值?