这个问题与战略有关,而不是具体的代码。我正在努力想出一个可行的方法,我希望有人可能遇到过类似的挑战。
我正在构建一个Animate程序:
让用户在舞台上画一条线(通过一系列鼠标点击)。
捕获数组中每次鼠标单击的坐标,并将它们添加到在UI中显示和更新的表格中。
显示结果行。
允许用户编辑任何坐标,并相应地更新所有(1)(2)和(3)。
前三个步骤正常运行,但很难......我应该如何编辑数据?我在一个包含坐标集的文本区域放了一个监听器,但我认为这是一个死胡同。它只是一个包含换行符的字符串,因此很难编辑特定的几个字符并让AS3 / Animate检测到已更改的内容。
这有什么好的技巧吗?
背景:对AS1很满意,完全跳过AS2,现在(12年后),我正在努力解决AS3问题。这令人沮丧,但是......我已经建立了一个包,它正在运作。
答案 0 :(得分:0)
您需要的最重要的概念是模型 - 视图 - 控制器设计模式。
首先定义代表应用程序中数据的模型。
根据您的要求这样做。
对象作为模型工作的最低要求是它在更改时通知其他人,因为MVC严重依赖于观察者模式,并且您希望观察数据何时发生变化。在As3中,使用内置的EventDispatcher
是有道理的。
在你的情况下,嵌套模型是有意义的,也就是说,你有一个模型用于每个单独的点,然后是另一个模型作为所有点的集合。
向模型类添加方法以修改数据。您想要为点集合添加和删除点,并且您想要修改每个点的坐标。
每个视图都接收对表示点集合的模型对象的引用。一个视图可能会将它们绘制到一个坐标系中并用线连接它们,另一个视图可能是一个表格式。
控制器知道模型并对视图上的用户输入做出反应。 例如,当有人点击视图时,会插入一个新点。
鉴于应用程序的简单性,将视图和控制器组合起来可能是有意义的,这样每个视图都可以直接操作模型。
我应该如何使这些数据可编辑?
通过在模型上创建允许您完全执行此操作的方法。
例如,假设LineView
类接收包含所有点的PointListModel
并将其存储在私有变量中
public LineView (pointList:PointListModel)
{
list = pointList;
现在它将根据列表创建图形资产来表示点(这应该在PointListModel
对象发出变化时执行:
private onListChanged(event:Event):void
{
for each(var point:PointModel in list)
{
// draw circle or whatever
由于视图中每个可视资产的创建都基于模型,因此应该可以连接它们。当用户现在修改可视资产时,可以将所做的修改应用于PointModel
对象。请记住:对模型所做的任何修改都会导致它分派一个被修改过的事件。这将告知所有其他观点,这一点已被修改。
这是如何拖延&在一个视图中删除表示点的圆将使得在另一个视图中显示的该点的坐标更新,就像它们被链接在一起一样,因为它们是:通过共享模型对象。
关于如何将显示的表与底层数组数据相关联,我仍然有点模糊。我应该将表的每一行都作为一个单独的文本字段与关联的侦听器吗?
这取决于你。
您可以让整个表只监听代表所有点的模型的更改事件。这将导致整个表格更新。
或者您可以让表观察点列表模型以添加或删除表条目,并且表中的每个条目都会观察该列表中的一个点。这样,如果只有一个点得到更新,则只允许更新表中的单个条目。
请记住,闪存的组件会为您做很多事情。 Flex拥有更复杂的组件。可以使用自定义itemrenderer定义每个条目的呈现方式。