为什么我的班级不被认可?

时间:2012-06-18 16:57:49

标签: flex oop actionscript mxml

当我尝试使用Flexbuilder运行以下mxml文件时,收到错误消息

1046:未找到类型或不是编译时常量:AlertDataObject。

此代码来自main.mxml文件

<?xml version="1.0" encoding="utf-8"?>
 <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
layout="vertical" 
horizontalAlign="center" 
verticalAlign="middle"
xmlns:components="components.*" 
xmlns:ConferenceRequestForm="components.core.ConferenceRequestForm.*"
xmlns:ConferenceHomeScreen="components.core.ConferenceHomeScreen.*"
xmlns:ConferenceLoginForm="components.core.ConferenceLoginForm.*"
xmlns:debug="components.debug.*"
xmlns:RandomUserMaker="components.debug.RandomUserMaker.*"
xmlns:RandomConferenceMaker="components.debug.RandomConferenceMaker.*"
initialize="initializeApplication();" 
creationComplete="openConferenceHomeScreen();">

<mx:Script>
    <![CDATA[

        import flash.events.MouseEvent;

        public function debugButtonHandler(event:MouseEvent):void{

        userCredentials.logIn('admin', 'admin', "John", "Admin", 7, 99,0)

        openReportsForm(); 

        }

    ]]>
</mx:Script>


<mx:Button label="Debug Button" id="debugButton_btn" click="debugButtonHandler(event);" enabled="true" visible="false"/>

<RandomConferenceMaker:RandomConferenceMaker id="rcm" visible="false"/>
<RandomUserMaker:RandomUserMaker id="rum" visible="false"/>

<mx:Script source="../classes/ConferenceApp_action.as"/> 

</mx:Application>

这是 ConferenceApp_action.as 文件的顶部,该文件包含大多数应用程序逻辑,包括导入到定义失败的类的类 AlertDataObject

//Built-In Classes
import mx.managers.PopUpManager;

//events
import mx.events.CloseEvent;

//custom events
import classes.AlertDataObject;

这是创建错误的 ConferenceApp_action.as 文件中的行。

private function showChoiceWindow(data:AlertDataObject):void{
  .
  .
  .
}

这是AlertDataObject类。

package classes
{

public class AlertDataObject
{

    /****************
    Constants
    ****************/
    static public var TITLE_ALERT:String = "Alert";
    static public var TITLE_CONFIRM:String = "Please Confirm";
    static public var TITLE_DEBUG:String = "Debug";

    static public var TITLE_SUCCESS:String = "Success";
    static public var TITLE_FAILURE:String = "Failure";
    static public var TITLE_ERROR:String = "Error";

    /****************
    Properties
    ****************/
    private var __title:String;
    private var __text:String;

            .
            .

    /****************
    Getters / Setters
    ****************/
    public function get title():String{

        return __title;

    }

            .
            .
            .

    /****************
    Constructor
    ****************/
    public function AlertDataObject($text:String, $title:String="Alert", $yesFunction:Function=null, $yesFunctionArguments:Object=null, $noFunction:Function=null, $noFunctionArguments:Object=null, $dataProvider:Object=null, $icon:Class=null){

        //store basic props
        __title = $title;
        __text = $text;

        //store confirm props
        __yesFunction = $yesFunction;
        __yesFunctionArguments = $yesFunctionArguments;
        __noFunction = $noFunction;
        __noFunctionArguments = $noFunctionArguments;

        //store dataProvider object
        __dataProvider = $dataProvider;

        //store misc. props
        __icon = $icon;

    }

}

}

为什么Flex没有正确看到AlertDataObject类?

3 个答案:

答案 0 :(得分:1)

我猜测你导入ConferenceApp_action.as文件的方式是,包含AlertDataObject类的classes目录存储在项目的根目录中。如果是这种情况,请尝试将classes文件夹移动到创建main.mxml文件的src目录。默认情况下,这是使用Flex Builder设置项目的主要源文件夹,以及编译器查找自定义类的位置。

请注意,您可以在项目属性对话框中的flex构建路径选项下更改默认源文件夹或指定其他源文件夹,但在您的情况下,我认为您不需要执行其中任何一项。

答案 1 :(得分:1)

我愿意打赌您的ConferenceApp_Action.as文件或main.mxml文件中存在语法错误,导致文件无法完全编译。基本上你正在做的是“包含”而不是使用正确的类,并且当你这样做时你没有得到非常好的错误消息。可能是因为Flex团队忘了他们为人们打开了大门(这不是一个很好的做法)。

IMO,你很幸运,你有任何编译错误。我曾经继承过一个使用这些类型包含的项目,开发人员忘记将一些文件添加到版本控制中。我没有收到错误消息 - 它只是默默无法编译。

我的建议是至少使用Flex团队所考虑的类型的OOP(换句话说是正确的类文件),并获得编译器的全部权重帮助您。如果不这样做,请尝试将指向.as文件的脚本标记移动到另一个脚本标记之上。或者甚至确保所有的import语句都在同一个脚本块中。

FWIW,我相信在Flex Framework的内容中有一些以“$”开头的变量,这个前缀的含义是“这些是我们正在推动的Flash Player定义的原始变量/方法。背景和我们自己的版本覆盖。“我不认为这是你的意图,看着你的代码,但如果是这样,那么以你的方式命名变量是没有错的。

答案 2 :(得分:-1)

您提供的代码中没有任何地方实际实例化AlertDataObject类。因此,编译器不会编译它,并且您在运行时也看不到它。另一个可能导致问题的事情是在使用actionscript时使用PHP编码约定。我不认为我曾尝试使用'$'来启动我的变量名称,但至少它违背了所有良好的actionscript实践,并且最多可能会导致您遇到的奇怪的运行时问题