Flex中的全局变量

时间:2011-08-10 20:23:02

标签: flex actionscript-3

我正在尝试使用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 Update查询。我的问题是FlexGlobals.topLevelApplication.appID始终为0,由于某种原因,全局变量永远不会更新,我已经检查以确保result.data [0]是正确的,但值永远不会传递给全局变量。< / p>

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

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:9)

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

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

然后在另一个类中使用:

访问它
Globals.APP_ID = result.data[0];

答案 1 :(得分:1)

当我开始时,我发现mxml和AS3与Zend Framwork,php和WAMP的混合设置有点令人生畏,并且很难与Flex作为编程环境达成协议。全局变量的使用缓解了这种痛苦。

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

首先创建一个Globals类

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通常被称为糟糕的编程实践......我同意这一点,但对于那些起步的人来说......这并不是一个糟糕的方式。随着您在此环境中编码变得更好/更聪明,可以在稍后使用好的编程位。

答案 2 :(得分:0)

public var appID:int;

appID将为0,直到您为其他人指定其他内容。