【问题标题】:Refer to a Spark view component in code在代码中引用一个 Spark 视图组件
【发布时间】:2011-11-12 16:08:19
【问题描述】:

我正在使用 Flash Builder 4.5 构建一个移动 AIR 应用程序。我的视图包中的初始视图是 TestHomeView.mxml。我想在应用程序其他地方的一个 .as 类中引用它,但我不知道该怎么做。

理论上我应该能够向 TestHomeView.mxml 添加一个“id”属性,但 FB 给我一个错误:“id is not allowed on the root tag of a component”。根标签是 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;

但它会返回 null。当我在 Model 类中放置断点时它不为空,但当我尝试从视图类访问它时,它为空。模型本身不为空,但该变量为空。

我做错了什么?

谢谢。

【问题讨论】:

    标签: actionscript-3 apache-flex flash-builder mxml


    【解决方案1】:

    首先,如果您尝试在 AS3 中创建单例,您应该首先在与 Model 相同的类文件中创建一个类,用于确保您只能创建一次该类。

    在 Model 类文件的底部(Model 类之外)添加这个类:

    internal class SingletonEnforcer{} 
    

    然后像这样创建模型构造函数:

    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)
    

    这将返回应用程序的实例。

    一旦你像我在上面那样设置了单例,你应该能够像这样访问你的数组:

    Model.Instance.myArray;
    

    我希望这会有所帮助!

    【讨论】:

    • 保罗 - 感谢您的帮助。我创建了一个简单的应用程序进行测试,您的代码有效!只要调用它的类是(或扩展)UIComponent,父应用程序就可以工作。我最初的问题仍然存在,但这一定意味着代码中正在发生其他事情,以某种方式将我的数组重置为空。我必须追捕它。
    • 在你的代码中你没有显示你初始化数组的位置,你有没有在里面放任何东西? var myArray:Array = ["AS3", "Flex"];
    【解决方案2】:

    遵循 MVC 模式。
    使用属性viewArray 创建模型类(使其可绑定)。从您的视图绑定到此属性。在任何其他类中,只需更改模型的 viewArray 属性。绑定事件将被触发,并且此属性也将在您的视图中更改。要让您的模型在任何时候都“可见”,您可以将其设为单例。

    【讨论】:

    • “从您的视图绑定到此属性”是什么意思?如何?请参阅上面的编辑。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 2018-07-23
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    相关资源
    最近更新 更多