【问题标题】:force redraw on component强制重绘组件
【发布时间】:2011-01-10 04:20:57
【问题描述】:

我有一个带有登录屏幕的应用程序。当用户点击“enter”时,状态变为“login”并触发加载子组件(尽管子组件此时保持不可见)。孩子包含用户在登录时需要的许多功能(即,他们的屏幕名称和设置是从数据库中检索的)。 'Parent' 中包含以下内容:

<local:comp id="localComp" includeIn="login" includeInLayout="false" visible="false"/>
<mx:Button label="login" click="currentState='login'"/>
<mx:Button label="logout" click="currentState='Default'"/>

我的问题是,当用户注销(状态更改为“默认”)然后重新登录(状态更改回“登录”)时,孩子不会再次被“触发”并且功能 w/in孩子不要重新加载。有没有办法强迫我的孩子刷新?

注意:虽然将子函数移动到父函数会更容易,但它很复杂......我将这些函数移动到子函数以便更容易理解

更新:我什至尝试在我的状态中添加“exitState”:

<s:State name="login" exitState="removeElement(localComp)" /> 

这也不起作用,因为我收到一个错误:“RangeError: Index 0 is out of range.”

更新: 即使您可以从父母那里调用孩子的函数,我的问题是需要“创建”孩子才能不显示错误。对我来说,为什么 flex 团队会让移除和添加孩子这样的事情变得如此复杂,这对我来说毫无意义。

【问题讨论】:

  • 好的。让我们尝试以不同的方式解决这个问题。当状态改变时,你需要你的 localComp 做什么?相反,您可以从 currentStageChange 事件调用 localComp 上的方法吗?
  • 我需要做的就是调用 init();驻留在 localComp 中的函数。

标签: apache-flex


【解决方案1】:

首先,我认为您不必在自定义组件中同时设置 includeIn 和 visible+includeInLayout 属性。使用 includeIn 时,当您的组件处于“登录”以外的其他状态时,框架会自动将您的组件从显示列表中删除。

为了回答您的问题,我宁愿使用 addedToStage(在您的自定义组件中)事件或 currentStateChanged(在父组件中)事件。这些事件应该在状态变为登录时触发

【讨论】:

  • 我在 Google 上搜索了有关 addedToStage 和 currentStateChanged 事件,但我不太确定您的意思。你有例子吗?
【解决方案2】:

您的孩子不会再次被“触发”,因为您每次切换状态时都是同一个孩子。 Flex 只是切换它的可见性——它仍然是完全相同的对象。如果您想在将其添加到舞台时执行特定操作,则需要在状态更改时将该子级删除/添加到舞台中,而不是仅仅切换其可见性。

一个有用的方法是使用 Flex 3 的&lt;mx:AddChild/&gt;

例子:

<mx:states>

        <mx:State name="login">

            <mx:AddChild position="firstChild">

                <local:comp id="localComp"/>

            </mx:AddChild>

        </mx:State>
</mx:states>

【讨论】:

  • 我正在使用 flex 4,我收到一个错误“可能不再显式声明状态覆盖。不推荐使用旧状态语法”
  • 查看我上面的编辑....我以更灵活的 4 友好方式尝试了您的方法...我尝试了 AddElement 和 RemoveElement 的各种组合,但无济于事(我收到错误说要使用 AddElement 和 RemoveElement,而不是您建议的 AddChild)
  • 哦,我的错。我以为您使用的是 Flex 3,因为 &lt;mx:Button/&gt;'s
  • 为什么他们会放弃那种方法却不提供替代方案?
  • 好吧,如果 includeIn 的工作方式与在 Flex 3 中的工作方式相同,理论上应该删除并创建一个新实例。他们可能通过缓存组件在 Flex 4 中对其进行了改进。我需要检查一下。
【解决方案3】:

如果我没看错的话,localComp 是一个非可视组件,可以处理让您登录某些服务的繁重工作,对吗?

enterState 是否对localComp 开火?您可以从那里致电init。或者,如果init() 是您的组件的初始化处理程序,让它做任何必须坚持的必要的管道工作,并将实际的登录时代码移动到一个单独的函数中。

当然,这实际上不是我会这样做的方式。将逻辑放入一个组件中,该组件具有允许它成为显示对象图的一部分的所有基础结构,然后不显示它,这是一种浪费。相反,让您的“组件”从 Object 或其他东西继承,然后简单地在脚本块中声明它的实例。然后你可以直接从login 的click 处理程序调用它的逻辑。只需使用状态来更新 UI 的状态...这就是它们的真正用途。

<mx:Button label="login" click="login_clickHandler(event)"/>
<mx:Button label="logout" click="currentState='Default'"/>

<fx:Script>
    <![CDATA[
        protected var localComp:MyComponent = new MyComponent();

        protected function login_clickHandler(event:MouseEvent):void
        {
            localComp.DoLoginStuff();
            currentState = 'login';
        }    
    ]]>
</fx:Script>

【讨论】:

    猜你喜欢
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 2013-01-08
    • 2015-12-27
    相关资源
    最近更新 更多