Flex: оболочка для ResourceManager.getInstance (). GetString не уведомляется об обновлениях localeChain - PullRequest
2 голосов
/ 16 февраля 2010

Я написал служебную библиотеку, которая содержит некоторые из моих наиболее часто используемых функций. Там у меня есть оболочка для ResourceManager.getString, чтобы упростить использование диспетчера ресурсов в классах не-пользовательского интерфейса:

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 все работает как положено.

Поскольку это всего лишь оболочка, я легко могу вернуться к «длинной» записи, но мне любопытно, как бы я достиг желаемого поведения.

Ответы [ 2 ]

3 голосов
/ 17 февраля 2010

К сожалению, опубликованный код Ланса не работает. У меня обновленная версия. Однако это нельзя использовать с глобальной публичной функцией, так как я хотел, чтобы она работала. Он по-прежнему должен быть 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));     
        } 
    );
}
0 голосов
/ 17 февраля 2010

Вам просто нужно привязаться к событию изменения 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()
  • singleton: делает это как ResourceManager.getInstance().getString()

Надеюсь, это поможет, Lance

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...