这个问题与策略有关,而不是与特定代码有关。我正在努力想一个可行的方法,我希望有人可能遇到过类似的挑战。
我正在构建一个动画程序,它将:
-
允许用户在舞台上画一条线(通过一系列鼠标点击)。
-
捕获阵列中每次鼠标单击的坐标,并将它们添加到UI中显示和更新的表中。
-
显示结果行。
-
使用户可以编辑任何坐标,并相应地更新所有(1)(2)和(3)。
前三个步骤还可以,但是。。。我应该如何使该数据可编辑?我在保存坐标集的文本字段上放置了一个监听器,但我认为这是一条死胡同。这只是一个带有换行符的字符串,因此很难编辑特定的几个字符,并让AS3/Animate检测到发生了什么变化。
有好的技巧吗?
背景:对AS1很满意,完全跳过了AS2,现在(12年后),我正在努力应对AS3。这很令人沮丧,但是。。。我已经建立了一个包,它正在发挥作用。
您需要的最重要的概念是模型-视图-控制器设计模式。
模型
从定义表示应用程序中数据的模型开始。根据您的要求进行操作。对象作为模型工作的最低要求是,当它发生更改时,它会通知其他人,因为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
对象。请记住:对模型所做的任何修改都会导致它分派一个被修改的事件。这将告知所有其他观点,这一点已被修改。
这就是拖动&在一个视图中删除代表一个点的圆将使另一个视图显示的该点的坐标更新,就像它们链接在一起一样,因为它们是:通过共享模型对象。
对于如何将显示的表与底层数组数据相关联,我仍然有点模糊。我应该让表的每一行都是一个单独的文本字段,并带有一个关联的监听器吗?
这取决于你。
您可以使整个表只侦听表示所有点的模型的更改事件。这将导致整个表被更新。
或者,您可以让表观察点列表模型来添加或删除表条目,并且表中的每个条目都观察该列表中的一个点。如果只更新了一个点,则只能更新表中的单个条目。
请记住,flash的组件为您做了很多这方面的工作。Flex有更复杂的组件。每个条目的渲染方式可以使用自定义项渲染器来定义。