Что-нибудь похожее на родительское представление с вложенными представлениями во Flex 4.6? - PullRequest
0 голосов
/ 22 марта 2012

Есть ли способ создать родительский вид с системой sub view в flex? Например, мне нужно создать приложение, которое рассчитывает страховые тарифы для разных продуктов. Все продукты должны иметь одинаковые данные для пола, возраста и употребления никотина. То, что я хотел бы сделать, это иметь «родительское представление» (которое на самом деле не будет отображаться), в котором расположены все эти основные поля, а затем создать вспомогательные представления, которые автоматически отображают компоненты и макет родительского представления, что сократить дублирующий код. в подвидах будут присутствовать дополнительные компоненты, уникальные для данного продукта (в некоторых также должно быть указано количество детей и т. д.), и ставки будут рассчитываться различными способами.

Редактировать: скажем, у меня есть 2 разных продукта. ProdA и ProdB

Это представление для ProdA

<?xml version="1.0" encoding="utf-8"?>
<components:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
             xmlns:s="library://ns.adobe.com/flex/spark" xmlns:components="spark.components.*" title="ProdA"
             xmlns:mx="library://ns.adobe.com/flex/mx">
<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>

<fx:Script>
    <![CDATA[

        import ASClasses.LL;

        public function makeLL(age:String, gen:String, nic:String):void{
            var intAge:int=int(age);
            var newLL:LL=new LL(intAge, gen, nic);
            dest.text=String(newLL.computeRate());  
        }

    ]]>
</fx:Script>

<s:VGroup width="100%" height="100%" verticalAlign="middle" horizontalAlign="center">

        <s:Label text="Age:"/>
        <s:TextInput id="age" restrict="0-9" maxChars="2"/>

        <s:ComboBox id="GenderBox" width="140" prompt="Gender" > 
            <s:dataProvider>
                <mx:ArrayList>
                    <fx:String>Male</fx:String>
                    <fx:String>Female</fx:String>
                </mx:ArrayList>
            </s:dataProvider>
        </s:ComboBox>

        <s:Label text="The selected gender is: {GenderBox.selectedItem}"/>

        <s:ComboBox id="NicotineBox" width="140" prompt="Nicotine Usage"> 
            <s:dataProvider>
                <mx:ArrayList>
                    <fx:String>Smoker</fx:String>
                    <fx:String>Non-Smoker</fx:String>
                </mx:ArrayList>
            </s:dataProvider>
        </s:ComboBox>

        <s:Label text="The selected Nicotine is: {NicotineBox.selectedItem}"/>

        <s:Button label="Get Rate" click="makeLL(age.text, GenderBox.selectedItem, NicotineBox.selectedItem)" />
        <s:TextInput id="dest" />       
    <s:Button label="Back" click="navigator.popView()" styleName="back" />
</s:VGroup>

Это представление для ProdB

<?xml version="1.0" encoding="utf-8"?>
<components:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
             xmlns:s="library://ns.adobe.com/flex/spark" xmlns:components="spark.components.*" title="ProdB"
            xmlns:mx="library://ns.adobe.com/flex/mx">
<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>

<fx:Script>
    <![CDATA[
        import ASClasses.OP;

        public function makePerson(age:String, gen:String, nic:String):void{
            var intAge:int=int(age);
            var newOP:OP=new OP(intAge, gen, nic);
            dest.text=String(newOP.computeRate());  
        }

    ]]>
</fx:Script>

<s:VGroup width="100%" height="100%" verticalAlign="middle" horizontalAlign="center" >

    <s:Label text="Age:"/>
    <s:TextInput id="age" restrict="0-9" maxChars="2"/>

    <s:ComboBox id="GenderBox" width="140" prompt="Gender"> 
        <s:dataProvider>
            <mx:ArrayList>
                <fx:String>Male</fx:String>
                <fx:String>Female</fx:String>
            </mx:ArrayList>
        </s:dataProvider>
    </s:ComboBox>

    <s:Label text="The selected gender is: {GenderBox.selectedItem}"/>

    <s:ComboBox id="NicotineBox" width="140" prompt="Nicotine Usage"> 
        <s:dataProvider>
            <mx:ArrayList>
                <fx:String>Smoker</fx:String>
                <fx:String>Non-Smoker</fx:String>
            </mx:ArrayList>
        </s:dataProvider>
    </s:ComboBox>

    <s:Label text="The selected Nicotine is: {NicotineBox.selectedItem}"/>

    <s:Button label="Get Rate" click="makePerson(age.text, GenderBox.selectedItem, NicotineBox.selectedItem)" />
    <s:TextInput id="dest" />       
    <s:Button label="Back" click="navigator.popView()" styleName="back" />
</s:VGroup>

Почти весь код одинаков за исключением нескольких различий. Я хотел бы иметь одно представление (Product), содержащее весь дублированный код, а затем ProdA и ProdB расширить этот продукт. Чтобы все в представлении «Продукт» отображалось как в ProdA, так и в ProdB

1 Ответ

1 голос
/ 22 марта 2012

Использовать внедрение зависимостей (открывать общедоступные свойства, которые затем можно связать в представлении), что освобождает вас от необходимости определять все это встроенным образом, как показано выше.это выглядело бы примерно так

[Bindable]
public var dataProvider:ArrayList
//..other public vars
<s:ComboBox id="combo" width="140" prompt="{promptPublicVar}" >
          <s:dataProvider>{dataProviderPublicVar}</s:dataProvider>
          <s:change>publicVarContainingSelection=combo.selectedItem</s:change>
</s:ComboBox>  

<s:Label text="{label}: {publicVarContainingSelection}"/> 

И вы бы использовали что-то вроде

<myNS:MyView>
   <myNS:prompt>Gender</myNS:prompt>
   <myNS:dataProvider><mx:ArrayList>...</mx:ArrayList></myNS:dataProvider>
   <myNS:label>The selected Gender is: </myNS:label>
</myNS:MyView>

=========== не писать больше кодачтобы попытаться угадать, что вы хотите, так ============

вот несколько шаблонов, которые вы могли бы найти полезным:

Обратите внимание, что в третьей ссылке также упоминается код позади,который может использоваться как тип абстрактного класса.

Кроме того, вы можете рассмотреть состав по наследованию .Например, ваше представление не должно знать или заботиться о том, как рассчитать информацию о тарифах, но может иметь компонент данных калькулятора тарифов, переданный ему.Который он наиболее решительно не должен создавать для себя - это одна из причин, по которой вам так трудно прийти к многоразовому дизайну.

...