【问题标题】:Flex general architecture/logic advice needed需要 Flex 通用架构/逻辑建议
【发布时间】:2011-04-21 02:20:17
【问题描述】:

我有一个架构/逻辑问题。这就是我想要实现的目标:

  • a) 我的主按钮中有三个按钮 应用程序。
  • b) 当您单击任何 按钮,一个海关组件,基于 一个标题窗口打开。
  • c) 在 titleWindow 是一个是/否选择器。
  • d) 如果答案是“是”,那么我想要 更改按钮的颜色 在主应用程序中单击以 红色的。如果答案是“否”,那么 中的按钮没有任何反应 主应用。

我的问题是“记住”单击哪个按钮并处理是/否问题的最佳/最简单方法是什么。

解决方案:

  • a) 创建一个变量,其 id 为 在主菜单中单击的按钮 应用程序并在 该 id 的组件

  • b) 然后在 处理是/否的组件 题。自定义事件将使用 按钮 id 作为参数并发送 回到主应用程序。

有没有更好/更简单的方法来做到这一点?我是否正确接近它?将按钮 id “发送”到组件中然后再次退出是否有意义?

谢谢。

-拉克西米迪

【问题讨论】:

    标签: apache-flex


    【解决方案1】:

    您无需大量编码即可轻松完成此操作。假设您为每个要变红的按钮显示不同的 TitleWindow,您只需使“想变红”按钮的 styleName 与每个标题窗口中单击按钮的切换状态无关。当然,您必须将 TW 按钮的 toggle 属性设置为 true=,然后获取它们的 selected 属性。

    例子:

    <mx:Button styleName="{titleWindow_01.yesButton.selected ? 'redStyle' : 'plainStyle'}" text="Blah"/>
    

    在你的 TitleWindow 中

    <mx:Button id="yesButton" toggle="true" text="Yes"/>
    

    这些按钮显然还有其他属性,但这让您大致了解无需大量编码即可轻松完成。绑定会自动进行,因此您甚至无需担心。

    【讨论】:

    • 您好 Robusto,感谢您的建议。
    【解决方案2】:

    看看这个命令模式。

    当按钮被按下时,将对被单击的按钮的引用传递给命令。

    如果你使用的是 Spring AS,类似这样的东西......

    <mx:Button id="myButton1" click="EventBus.dispatchEvent(new CommandEvent('testButton', myButton1))" />
    

    在命令中,弹出对话框,处理响应并设置对您传入按钮的引用的样式。

    这将您正在执行的操作的逻辑与 UI 组件本身分离(它甚至不需要是按钮,命令可以采用 UIComponent)。

    它也不会在您的应用程序周围留下状态,例如最后单击哪个按钮/等等,因为您正在执行的逻辑的所有状态都封装在命令中。

    命令的简要伪代码

    public class TestUICommand implements Command, RequiresContext {
        private var _context : UIComponent;
        private var _dialog : MyDialog;
    
        // Your command controller would set the reference to the button here.
        public function set context( cxt : UIComponent ) : void {
            _context = cxt;
        }
    
        public function execute() : * {
            _dialog = new MyDialog();
            _dialog.popup();
            _dialog.addEventListener( "yes", doYes );
            _dialog.addEventListener( "no", closeDialog);
        }
    
        private function doYes( event : Event = null ) : void {
            _context.setStyle("color", 0xFF0000);
            closeDialog();
        }
    
        private function closeDialog( event : Event = null ) : void {
            _dialog.close();
        }
    }
    

    【讨论】:

    • 您好 Gregor Kiddie,感谢您的帮助。不幸的是,我是新手,所以我还没有使用反转控制框架。我将不得不更多地研究您的解决方案。再次感谢您花时间帮助我。
    • 实现它的低保真方式(没有框架)是让您的点击处理程序执行 var myCommand = new TestUICommand(); myCommand.context = event.target; myCommand.execute();这将产生几乎相同的效果,并且仍然保持良好的解耦。
    【解决方案3】:

    我宁愿在主应用程序中有一个lastClickedButton 私有变量,并在单击其中一个按钮时设置它。单击“是”按钮时,TitleWindow 组件将调度主应用程序正在侦听的正常事件(具有适当的事件类型,例如YES_CLICKED)。从事件处理程序中设置lastClickedButton 的颜色。

    这个想法是 单击了哪个按钮 是仅与主应用程序相关的信息 - TitleWindow 组件与它无关。当我们将按钮 id 传递给 TitleWindow 时,我们不必要地创建了对主应用程序的依赖项。如果将来您想将 TitleWindow 组件用于其他目的,这个按钮 id 变量将在那里变得毫无意义。

    【讨论】:

    • 您好 Amarghosh,感谢您的帮助。我会听从你的建议。您的解决方案是直截了当的。您是对的,单击哪个按钮仅与主应用程序相关。谢谢。