2011-12-01 56 views
2

我还没有完全地了解自定义组件是如何工作的?Flex的自定义组件,最好的方式来使用它

假设我有我的Main.mxml应用

<?xml version="1.0" encoding="utf-8"?> 
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark" 
     xmlns:mx="library://ns.adobe.com/flex/mx" 
     xmlns:local="*"> 
    <fx:Script> 
     <![CDATA[ 
      private var privateStr:String = "Stringa Private"; 
      public var publicStr:String = "Stringa Public"; 
     ]]> 
    </fx:Script> 
    <local:AddUser height="100" width="500"/> 
    <s:Label id="lblText" x="120" y="120" width="418" height="115" text="!!!"/>          
</s:WindowedApplication> 

和组件AddUser.mxml

<?xml version="1.0" encoding="utf-8"?> 
<mx:VBox 
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx" 
    creationComplete="initialize_component()"> 
    <fx:Script> 
     <![CDATA[            
      public var btnName:String = "Login"; 
     private function initialize_component():void 
     { 
      login.label = btnName;    
      } 
      private function doLogin():void 
      { 
      //some stuff here 
      } 

     ]]> 
    </fx:Script> 
    <s:TextInput id="txtuser" x="96" y="36"/> 
    <s:TextInput id="txtpass" x="96" y="66"/> 
    <s:Button id="login" x="96" y="96" width="128" click="doLogin()" /> 
</mx:VBox> 

我想在按钮上(登录)点击我得到的publicStr/privateStr是在main.mxml ... 难道我让一切错了吗?我怎样才能使用更多的组件,例如它们都是同一个应用程序的一部分,并使用相同的变量/方法?

回答

2

看来你似乎有与封装的想法问题。子组件不应该知道父组件,View组件不应该做真正的工作,只需要从Controller组件中请求工作。在非常简单的项目中,顶层组件可以包含控制器逻辑,但许多人更愿意在小型项目中保持独立。如何做到这一点超出了这个答案的范围。

那么,父母和孩子应该如何正确沟通?子组件应公开属性,父项(或Framework,如果您准备使用依赖注入框架)可以仅填充子组件需要的数据。

子组件通过生成事件向控制器请求工作。

所以,doLogin()将containe像

dispatchEvent(new Event('doLogin')); 

与父组件将被监听此事件。在其处理程序中,您将执行登录。更可能的是,您的登录将是异步的,所以您需要另一个处理程序来监听登录数据才能返回。当登录数据返回时,您将根据返回值在登录视图中设置属性。