2010-02-16 5 views
2

필자는 가장 많이 사용되는 함수 중 일부가 포함 된 유틸리티 라이브러리를 작성했습니다. 이 나는 비 UI 클래스의 자원 관리자를 사용하여 간단하게 ResourceManager.getString에 대한 래퍼가 있습니다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의 change 이벤트에 바인딩하면 _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

Unfortunatley 작동하지 않습니다 게시 된 코드 랜스처럼 만듭니다. 업데이트 된 버전이 있습니다. 그러나이 기능은 글로벌 공용 기능과 함께 사용할 수 없습니다. 사용할 파일마다 여전히 included이어야합니다. 그렇기 때문에 실제로는 유용하지 않습니다.

// 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));  
     } 
    ); 
} 
관련 문제