2010-02-16 26 views
2

我写了一个实用程序库,其中包含一些我最常用的功能。 在那里,我有ResourceManager.getString的包装使用非UI类资源管理器简化:Flex:包装ResourceManager.getInstance()。getString没有通知localeChain更新

package 
{ 
    import mx.resources.ResourceManager; 
    /** 
    * Convenience function to return a localized string 
    * */ 
    [Bindable("change")] 
    public function _s(bundle:String, resourceName:String):String 
    { 
     return (ResourceManager.getInstance().getString(bundle, resourceName)); 
    } 
} 

的问题是,当查找localeChain改变时,该函数将不会被调用,而当调用resourceManager.getString一切都按预期工作。由于它只是一个包装,我可以轻松地切换回“长”符号,但我很好奇我将如何实现所需的行为。

回答

0

您只需绑定到ResourceManager的更改事件,然后重新分派它以执行_s的绑定。事情是这样的:

import flash.events.Event; 

import mx.binding.utils.BindingUtils; 
import mx.resources.IResourceManager; 
import mx.resources.ResourceManager; 

/** 
* Convenience function to return a localized string 
* */ 
[Bindable("change")] 
public function _s(bundle:String, resourceName:String):String 
{ 
    return (resourceManager.getString(bundle, resourceName)); 
} 

override protected function createChildren():void 
{ 
    super.createChildren(); 
    BindingUtils.bindSetter(dispatchChange, resourceManager, "change"); 
} 

private function dispatchChange(event:Event):void 
{ 
    dispatchEvent(new Event("change")); 
} 

这只是一个样本包括脚本(include "resource_wrapper.as"),它不应该工作开箱即用,但不过你可以修改它。

include的唯一问题是您必须手动将其包含在大量文件中。但是,这是你可以把它一个“点”深厚的唯一途径:

  • include:使它像getString()(或_s());
  • 正常:使它像resourceManager.getString()
  • 单:使它像ResourceManager.getInstance().getString()

希望帮助, 兰斯

+0

感谢您的指导。 – flocki

3

抱歉,系统代码兰斯发布不起作用。我有一个更新版本。然而,这不能与全球公共职能一起使用,因为我希望它能够工作。在每个要使用的文件中,它仍然是included。因此,它不是真正有用的SWC

// ActionScript file 
import flash.events.Event; 

/** 
* Convenience function to return a localized string 

* */ 
[Bindable("change")] 
public function _s(bundle:String, resourceName:String):String 
{ 
    return (resourceManager.getString(bundle, resourceName)); 
} 
override protected function createChildren():void 
{ 
    super.createChildren(); 
    resourceManager.addEventListener(Event.CHANGE, function(e:Event):void { 
      dispatchEvent(new Event(Event.CHANGE));  
     } 
    ); 
}