我正在使用Flash Builder 4.5构建移动AIR应用。我的视图包中的初始视图是TestHomeView.mxml。我想在应用程序的其他地方的某个.as类中引用它,我不知道该怎么做。
理论上我应该能够为TestHomeView.mxml添加一个“id”属性,但是FB给了我一个错误:“组件的根标签上不允许id”。根标签是s:view。
我需要这样做的原因是在另一个类中我进行了各种计算,然后需要将一个值数组传递给我的视图类中的一个组件。所以在SomeOtherActionScriptClass.as中,我首先组装数组myArray,然后在该类中我想这样做:
myViewComponent.viewArray = myArray;
如果我要这样做,我还需要将视图类导入到.as类中,这让我觉得很奇怪。那么有一种简单的方法可以做我想要的,或者我是否必须调度包含数组的自定义事件,并在视图类中监听它?
编辑 - 根据以下MVC建议,我在模型中做了以下内容:
[Bindable]
public class Model
{
private static var myModel:Model;//doesn't let me name it 'model' because
//I have a package named 'model'
public var myArray:Array; //its value set later in model code
public function Model()
{
if ( Model.myModel != null ){
throw new Error( "Only one Model instance should be instantiated" );
}
}
// singleton: always returns the one existing static instance to itself
public static function getInstance() : Model {
if ( myModel == null ){
myModel = new Model();
}
return myModel;
}
然后在视图代码中我有:
[Bindable] //do I actually need this?
private var myModel:Model = Model.getInstance();
var viewArray = new Array();
viewArray = myModel.myArray;
但它回来了。当我在Model类中放置一个断点时它不是null,但是当我尝试从view类访问它时,它是null。模型本身不为null,但该变量是。
我做错了什么?
感谢。
答案 0 :(得分:0)
遵循MVC模式
使用属性viewArray
创建Model类(使其成为Bindable)。从您的视图绑定到此属性。而在任何其他类中只需更改模型的viewArray
属性。绑定事件将被触发,此属性也将在您的视图中更改。要使模型从任何点“可见”,您可以将其设为单身。
答案 1 :(得分:0)
首先,如果您尝试在AS3中创建单例,则应首先在与Model相同的类文件中创建一个类,以确保您只能创建一次类。
在Model类文件的底部(Model类之外)添加此类:
internal class SingletonEnforcer{}
然后像这样创建Model构造函数:
public function Model(enforcer:SingletonEnforcer){ Init(); } // if init code is needed
public static function get Instance():Model
{
if (!myModel){
myModel = new Model(new SingletonEnforcer());
}
return myModel;
}
现在你不必为创建第二个实例抛出异常,因为它是不可能的。
我不确定您引用应用程序主mxml的第一个问题,但如果您询问如何调用正在运行的应用程序(如AIR中的WindowedApplication),那么您可以这样称呼它:
// my WindowedApplication file = MyApp.mxml
MyApp(this.parentApplication)
这将返回应用程序的实例。
一旦你像我上面那样设置了Singleton,你应该可以访问你的数组:
Model.Instance.myArray;
我希望这有帮助!