请参阅代码中的Spark视图组件

时间:2011-11-12 16:08:20

标签: actionscript-3 flex flash-builder mxml

我正在使用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,但该变量是。

我做错了什么?

感谢。

2 个答案:

答案 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;

我希望这有帮助!