有几种方法可以解决这个问题。一种是使用全局变量(如 unkiwii 的答案中所建议的),但这在 ActionScript 中不是很常见的方法。更常见的方法是:
类变量(静态变量)
创建一个名为DataModel
或类似的,并将该类上的数组变量定义为静态:
public class DataModel {
public static var myArray : Array = [];
}
然后,您可以使用应用程序中的任何部分访问它DataModel.myArray
。这很少是一个很好的解决方案,因为(与全局变量一样)应用程序的一部分无法知道应用程序的另一部分何时修改了数组的内容。这意味着,即使您的数据输入 GUI 将对象添加到数组中,您的数据列表 GUI 也不会知道显示新数据,除非您实现一些其他方式来告诉它重绘。
单例包装数组
另一种方法是创建一个名为 ArraySingleton 的类,它包装实际的数组并提供对其的访问方法,并且可以使用非常常见的单例模式(将单个实例保留在静态变量中)来访问该数组的实例。
public class ArraySingleton {
private var _array : Array;
private static var _instance : ArraySingleton;
public static function get INSTANCE() : ArraySingleton {
if (!_instance)
_instance = new ArraySingleton();
return _instance;
}
public function ArraySingleton() {
_array = [];
}
public function get length() : uint {
return _array.length;
}
public function push(object : *) : void {
_array.push(object);
}
public function itemAt(idx : uint) : * {
return _array[idx];
}
}
该类包装了一个数组,可以通过以下方式访问单个实例ArraySingleton.INSTANCE
。这意味着您可以执行以下操作:
var arr : ArraySingleton = ArraySingleton.INSTANCE;
arr.push('a');
arr.push('b');
trace(arr.length); // traces '2'
trace(arr.itemAt(0)); // trace 'a'
这样做的最大好处是,您可以在添加项目或以任何其他方式修改数组时调度事件,以便应用程序的所有部分都可以收到此类更改的通知。您可能希望通过实现更多类似数组的接口来扩展上面的示例,例如 pop()、shift()、unshift() 等。
依赖注入
大规模应用程序开发中的一种常见模式称为依赖项注入,基本上意味着通过以某种方式标记您的类(经常使用 AS3 元数据),您可以表明框架应该将引用“注入”到该类中。这样,类不需要关心引用来自哪里,但框架将确保它在那里。
一个非常流行的 AS3 DI 框架是机械腿 http://www.robotlegs.org/.