Flex,Swiz Framework:Mediate(EventListener)标记使用字符串常量不起作用

时间:2011-09-19 18:07:53

标签: flex events swiz

我正在使用Flex的Swiz框架。我试图使用mediate标签运气好我的问题是:

public class Locale {
    private static function onLoadSuccess(event:Event):void 
    {
        // I have a break point here.  I can tell that this code is being executed sucessfully
        Swiz.dispatchEvent(new DynamicEvent(ConfigConstants.LOCALE_RESOURSE_LOADED));
    }
}

在另一个课程中,我在这里有这段代码:

public class AcordianPane {
    ...
    [Mediate( event="localeResourseLoaded")]
    public function onLocaleResourseLoaded( ...rest):void
    {
            this.label = Locale.getUiString("title.map.broadcast");
    }
    ...
}

上面的代码按预期工作。当我将Mediate标记更改为常量时,我​​遇到了问题:

public class AcordianPane {
        ...
        [Mediate( event=ConfigConstants.LOCALE_RESOURSE_LOADED)]
        public function onLocaleResourseLoaded( ...rest):void
        {
            // THIS IS NOT EXECUTED NOW!
            this.label = Locale.getUiString("title.map.broadcast");
        }
        ...
}

任何人都知道为什么会这样吗?作为参考,这是我的ConfigConstants类:

public class ConfigConstants {
    public static const LOCALE_RESOURSE_LOADED:String = "localeResourseLoaded";
}

注意:Mediate标记与EventListener标记完全相同,该名称刚刚更改了几个名称。我知道它现在已经折旧但我认为没有任何理由在我们的代码库中进行查找和替换。


修改1 :我刚尝试用EventHandler代替Mediate,但同样的问题就出现了。


修改2 :以下是Swiz网页上的relevant documentation


编辑3 :我也尝试过将这个事件放在引号中(感谢@ Gerhard's):

[EventHandler( event="ConfigConstants.LOCALE_RESOURSE_LOADED")]
public function onLocaleResourseLoaded( ...rest):void
{
    this.label = Locale.getUiString("title.map.broadcast");
}

但事件仍未收到。我认为问题可能出在我的主要mxml文件中,我初始化Swiz:

<swiz:SwizConfig
    strict="true"                             // set by a co-worker
    mediateBubbledEvents="true"               // set by a co-worker
    viewPackages="com.sixtyfootersdude.views" // set by a co-worker
eventPackages="com.sixtyfootersdude.model" // <-- Just added!  
    beanLoaders="{ [ com.sixtyfootersdude.admin.AdminBeans ] }" /> // set by a co-worker

另请注意

  • AcordianPane位于com.sixtyfootersdude.views
  • Locale位于com.foxtrot.util
  • ConfigConstants位于com.sixtyfootersdude.model

编辑4 :我尝试过的最后一件事是:

[EventHandler( event="com.sixtyfootersdude.model.ConfigConstants.LOCALE_RESOURSE_LOADED")]
public function onLocaleResourseLoaded( ...rest):void{
    this.label = Locale.getUiString("title.map.broadcast");
}

<swiz:SwizConfig
    strict="true"
    mediateBubbledEvents="true"
    viewPackages="com.sixtyfootersdude.views"
    beanLoaders="{ [ com.sixtyfootersdude.admin.AdminBeans ] }" />

1 个答案:

答案 0 :(得分:1)

您不能在元标记中使用常量。不幸的是,这是对Flex的限制。相反,你必须使用常量的名称作为字符串。但是,Swiz会在初始化时检查这些常量是否存在。因此,如果您错误配置了[EventHandler],那么在应用程序启动期间您将收到错误。

因此,在您的情况下,解决方案将如下所示:

[EventHandler(event = "ConfigConstants.LOCALE_RESOURSE_LOADED")]
public function onLocaleResourseLoaded():void
{
}

确保ConfigConstants中的eventPackage包已配置为SwizConfig

有关详细信息,请查看Event Handling Using Class and Constant NamesSwiz Configuration

BTW:您不应再使用已弃用的[Mediate]