【问题标题】:Global Variable in FlexFlex 中的全局变量
【发布时间】:2011-08-10 20:23:02
【问题描述】:

我正在尝试在 Flex 中使用全局变量,但它似乎无法正常工作。

在我的默认 mxml 文件中,我声明以下内容

           public var appID:int;

此变量跟踪我的应用程序中的会话 ID 以用于 SQL 目的。 在另一个 mxml 页面上,我调用了以下代码,它应该将全局变量更新为当前 ID。

                // Get the ID
            sqlStatement.text =
                "SELECT Max(id)FROM applications";
            sqlStatement.execute();

            var result:SQLResult;

            result = sqlStatement.getResult();
            FlexGlobals.topLevelApplication.appID = result.data[0];

最后,我使用 ID 作为参数运行 SQL 更新查询。我的问题是 FlexGlobals.topLevelApplication.appID 始终为 0,由于某种原因,全局变量永远不会更新,我已经检查以确保 result.data[0] 是正确的,但值永远不会传递给全局变量。

有没有人看到我在这里做错了什么? 或者有没有人有更好的建议来跟踪我的应用程序中的 id?

提前感谢您的帮助!

【问题讨论】:

    标签: apache-flex actionscript-3


    【解决方案1】:

    我喜欢创建一个具有静态变量的“全局”类:

    package {
        public class Globals {
            public static var APP_ID:int;
        }
    }
    

    然后在另一个类中访问它:

    Globals.APP_ID = result.data[0];
    

    【讨论】:

    • 这对我来说很棒。一个为此!
    • 这似乎是最好的方法,谢谢!
    • 如果这是你自己的全局变量,你不妨把它放在文档类中,或者它应该属于哪个类,而不是专门为它创建一个全局类。
    • 为什么需要静态关键字?
    【解决方案2】:

    当我开始时,我发现 mxml 和 AS3 与 Zend 框架、php 和 WAMP 设置的混合有点令人生畏,并且很难将 Flex 用作编程环境。全局变量的使用稍微减轻了这种痛苦。

    对我有用的方式......虽然我确信可能有更好的例子,但以下是;

    首先创建一个全局类

    package
    {
        public class Globals
        {
        [Bindable] public var name                      : String;
        [Bindable] public var email                     : String;
        [Bindable] public var lecturersResult           : CallResponder;
        [Bindable] public var studentsResult            : CallResponder;
    
        [Bindable] public var datagrid_lecturers        : DataGrid;
        [Bindable] public var dropDownList_lecturerid   : DropDownList;
        [Bindable] public var DatabaseTables            : Accordion;    
        [Bindable] public var lectAdd                   : Button;
    
        // auto generated classes by Zend Framework, where references are setup here
    
        [Bindable] public var lecturers                 : Lecturers;
        [Bindable] public var students                  : Students;
    
            public function Globals()
            {
            // variables initialised
    
                name                = "";
                email               = "";
                lecturersResult             = new CallResponder();
                studentsResult              = new CallResponder();
                lectAdd                     = new Button();
                dropDownList_lecturerid     = new DropDownList();
                datagrid_lecturers          = new DataGrid();
                DatabaseTables              = new Accordion();
    
                lecturers                   = new Lecturers();
                students                    = new Students();
            }
    
            // also useful when creating functions used between classes.
    
            public function func1()
            {
            }
            public function func2()
            {
            }
            public function func3()
            {
            }
        }
    }
    

    在主项目 mxml 文件中,我声明了 Globals 类的一个实例

    public var g:Globals = new Globals();
    

    使用新实例的mxml代码片段

    <s:DataGrid id="datagrid_lecturers" x="10" y="10" width="860" height="300" editable="true" fontSize="12" requestedRowCount="4"
                    creationComplete="g.lecturersService.datagrid_lecturers_creationCompleteHandler(event,g,datagrid_lecturers,btnAddLecturer,btnDeleteLecturer,btnUpdateLecturer)" 
                    selectionChange="g.lecturersService.datagrid_lecturers_selectionChangeHandler(event,g)">
    

    另一个例子...

    g.lecturersResult.token = g.lecturersService.getAllLecturers();
    

    不利的一面是,我随身携带了很多行李,可能比必要的更具约束力。只要数据库很小,就可以正常工作。纯粹主义者不会喜欢这种方法。 Gloabls 通常被称为糟糕的编程实践......我同意,但对于那些刚开始的人......这不是一个糟糕的方式。随着您在这种环境中编码变得更好/更聪明,好的编程位可能会在以后一些。

    【讨论】:

      【解决方案3】:
      public var appID:int;
      

      appID 将为 0,直到您为其分配其他内容。

      【讨论】:

      • 这就是我在这里尝试做的 FlexGlobals.topLevelApplication.appID = result.data[0];但它没有将值分配给 appID
      • 尝试使用 parentDocument.appID = result.data[0];我建议创建自定义事件并为事件传递新的 id 值并在应用程序中监听它。科里的回答也很棒。
      猜你喜欢
      • 2011-05-07
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      • 2013-10-06
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多