2010-10-05 69 views
1

我有一个架构/逻辑问题。这是我想达到的:Flex的总体结构/逻辑的建议需要

  • a)我的主要 应用程序中有三个按钮。
  • B)当你点击任何按钮 的,一个TitleWindow中打开基于 海关组件。
  • c)在 titleWindow正在为是/否选择器。
  • d) 如果答案是“是”,那么我想 将在主应用程序中点击的按钮 的颜色更改为 红色。如果答案为“否”,则 主应用程序中的按钮不会发生任何变化。

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

解决方案:

  • 一)请用 按钮被点击主 应用程序,id的变量,并在 分量的公共变量设置为ID

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

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

谢谢。

-Laxmidi

回答

1

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

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

+0

嗨Amarghosh,谢谢你的帮助。我会遵循你的建议。您的解决方案非常简单。你说得对,哪个按钮被点击只与主应用程序相关。谢谢。 – Laxmidi 2010-10-05 16:30:57

1

看看这个命令模式。

当按钮被按下时,传递一个引用到点击该命令的按钮。

如果你正在使用Spring作为,这样的事情...

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

在命令中,扔了你的对话,处理响应和设置样式的引用您在传递的按钮。

这样可以使你从UI做什么逻辑组件本身(它甚至不需要是一个按钮,该命令可以采用UIComponent)。

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

命令的简要伪

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(); 
    } 
} 
+0

格雷戈尔基迪,谢谢你的帮助。不幸的是,我是新手,所以我没有使用倒置控制框架。我必须更多地研究你的解决方案。再次感谢您花时间帮助我。 – Laxmidi 2010-10-05 16:35:35

+0

这样做(没有框架)的低保真方式将让你的点击处理程序做var myCommand = new TestUICommand(); myCommand.context = event.target; myCommand.execute();这将会产生几乎相同的效果,并且仍然保持良好的分离。 – 2010-10-05 16:41:26

1

你可以没有很多编码做到这一点很容易。假设你有一个不同的TitleWindow为你想要变成红色的每个按钮显示,你可以使“想要变成红色”按钮将他们的styleName从每个标题窗口中单击按钮的切换状态中断开。当然,您必须将TW按钮的切换属性设置为true =,然后获取其所选属性。

例子:

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

而在你的TitleWindow中

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

这些按钮会明显有其他属性,但是这给你的,这是多么容易没有做一个最基本的想法很多编码。绑定会自动发生,所以你甚至不需要担心这一点。

+0

嗨Robusto,谢谢你的建议。 – Laxmidi 2010-10-05 16:26:38