我还没有完全理解自定义组件如何工作......
我们假设我有我的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>
我想在Button(登录)上点击我得到main.mxml中的publicStr / privateStr ... 我搞错了吗?我如何使用更多的组件,因为它们都属于同一个应用程序并使用相同的变量/方法?
答案 0 :(得分:2)
您似乎对封装的想法存在疑问。子组件不应该知道父组件,View组件不应该做真正的工作,只需要从Controller组件请求工作。在非常简单的项目中,您的顶级组件可以包含控制器逻辑,但是许多人更喜欢将它保持独立,即使在小型项目中也是如此。如何做到这一点超出了这个答案的范围。
那么,父母和孩子应该如何正确沟通?子组件应该公开父级(或者框架,如果您感觉准备使用依赖注入框架)只能填充子组件所需的数据的属性。
子组件通过生成事件从控制器请求工作。
因此,doLogin()会包含类似
的内容dispatchEvent(new Event('doLogin'));
并且父组件将监听此事件。在其处理程序中,您将执行登录。您的登录很可能是异步的,因此您需要另一个处理程序来侦听登录数据。当登录数据返回时,您将根据返回值在登录视图上设置属性。