根据连接状态更改Button初始currentState

时间:2014-06-11 16:28:51

标签: actionscript-3 flex flex4 flex4.5

我希望我的Button能够使用我自己定义的状态初始化它的currentState。我正在监视互联网连接,我的按钮的初始当前状态将取决于连接状态。我认为初始状态是在SkinnableComponent commitProperties函数上设置的:

override protected function commitProperties():void
{
    super.commitProperties();

    if (skinChanged)
    {
        skinChanged = false;
        validateSkinChange();
    }

    if (skinStateIsDirty)
    {
        // This component must first be updated to the pending state as the
        // skin inherits styles from this component.
        var pendingState:String = getCurrentSkinState();
        stateChanged(skin.currentState, pendingState, false);
        skin.currentState = pendingState;
        skinStateIsDirty = false;
    }...

所以我有我的按钮皮肤,根据连接状态,我想更改图标。我覆盖了我的皮肤类的函数initializationComplete,这样当连接状态改变时,我的currentState也会改变。

        override protected function initializationComplete():void
        {
            useChromeColor = true;
            BindingUtils.bindSetter(onConnectionChange,ServiceMonitor.getInstance(),'connectionStatus');
            super.initializationComplete();
        }  

        protected function onConnectionChange(value:Object):void
        {
            if(ServiceMonitor.getInstance().connectionStatus == 'Service.available')
                currentState = 'downOnline';
            else if(ServiceMonitor.getInstance().connectionStatus != 'Service.available')
                currentState = 'downOffline';
        }

除了初始状态覆盖我自己的组件初始化之外,这种方法很好。我通过覆盖commitProperties函数并在外观调用函数commitProperties之后调用函数onConnectionChange来解决这个问题。这是我的ButtonSkin的覆盖commitProperties函数:

                    override protected function commitProperties():void
        {
            super.commitProperties();
            onConnectionChange(null);
        }

由于我不知道改变currentState导致了多少处理,我担心通过多次调用onConnectionChange函数并因此多次更改currentState我会对性能产生负面影响。问题是onConnectionChange本身导致调用commitProperties。所以那里已有额外的处理。问题是有多少并且没有更好的方法。非常感谢你......

1 个答案:

答案 0 :(得分:1)

有几点需要注意:

  1. 您正在改变有效的“叶子”显示对象的状态。 Flex / Flash和基本上任何其他设计平台都基于层次结构 - 因此,除非您在根应用程序本身或应用程序的大型主干上更改状态/样式,否则任何性能降低都将是微不足道的。 / LI>
  2. 您可以在SDK中自行验证,大多数可绑定表达式通常忽略相同状态的更改 - 以防止您担心的问题。
  3. 有更好的方法吗?也许,也许不是。它最终取决于你想要什么/需要改变多少。

    如果您尝试更改的唯一内容是图标,这就是我采取的方法:

    <s:ToggleButton id="pendingBtn" width="22" height="22" toolTip="View Pending" 
                    icon="{AssetManager.pending_closed}" 
                    icon.PendingTransactions="{AssetManager.pending_open}"
                    selected.PendingTransactions="true" />