2010-02-16 13 views
2

J'ai écrit une bibliothèque d'utilitaires contenant certaines de mes fonctions les plus utilisées. Il J'ai une enveloppe pour ResourceManager.getString pour simplifier l'utilisation du gestionnaire de ressources dans les classes non-UI:Flex: Wrapper pour ResourceManager.getInstance(). GetString n'est pas averti des mises à jour de 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)); 
    } 
} 

Le problème est que lorsque le localeChain change, la fonction ne sera pas appelé, alors que lorsque invoquant resourceManager.getString tout fonctionne comme prévu. Comme c'est juste un wrapper, je peux facilement revenir à la notation "long", mais je suis curieux de savoir comment j'obtiendrais le comportement désiré.

Répondre

0

Vous avez juste besoin de vous lier à l'événement change de ResourceManager et de le redistribuer pour exécuter les liaisons pour _s. Quelque chose comme ceci:

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")); 
} 

C'est juste un exemple inclure un script (include "resource_wrapper.as"), il ne devrait pas travailler hors de la boîte, mais vous pouvez le modifier cependant.

Le seul problème avec include est que vous devez l'inclure dans beaucoup de fichiers manuellement. Mais c'est la seule façon que vous pouvez faire un « point » profonde:

  • include: Makes comme getString() (ou _s());
  • normal: Makes comme resourceManager.getString()
  • singleton: Donne comme ResourceManager.getInstance().getString()

espoir qui aide, Lance

+0

Merci pour les conseils. – flocki

3

Unfortunatley, la Lance de code affiché ne fonctionne pas. J'ai une version mise à jour. Cependant, cela ne peut pas être utilisé avec une fonction publique globale, comme je voulais que cela fonctionne. Il doit toujours être included dans tous les fichiers à utiliser. En tant que tel il est pas vraiment utile pour un 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));  
     } 
    ); 
}