2010-11-27 9 views
5

यहां एक कस्टम घटक का एक उदाहरण है।एक कस्टम फ्लेक्स 4 घटक के भीतर एमएक्सएमएल बाल नोड्स को कैसे रखा जाए?

<?xml version="1.0"?> 
<mx:Canvas ... > 
    <s:VGroup> 
     <s:Label text="(HEADING TEXT)" ... /> 

     (INSTANCE MXML) 

    </s:VGroup> 
    <mx:Image ... /> 
</mx:Canvas> 

एक MXML दस्तावेज़ में घटक का उपयोग कर, मैं करना चाहते हैं "(HEADING पाठ)" एक पैरामीटर के साथ प्रतिस्थापित (: यह सिर्फ एक शीर्षक लेबल के साथ एक बॉक्स और एक करीबी छवि (एक्स) है आसान होना चाहिए) साथ ही साथ "(इंस्टेंस एमएक्सएमएल)" कई लेबल, टेक्स्ट इनपुट, चेक बॉक्स इत्यादि के साथ (शायद कठिन)।

मैं this script-based method पाया है, लेकिन मैं एक क्लीनर संकलन समय समाधान चाहते हैं, यदि कोई मौजूद। कोई सुझाव?

उत्तर

10

MyComponent.mxml:

<?xml version="1.0"?> 
<mx:Canvas ... > 
    <fx:Script> 
     [Bindable] 
     public var headingText:String = "Default Heading Text"; 

    </fx:Script> 
    <s:VGroup> 
     <s:Label text="{headingText}" ... /> 

     (INSTANCE MXML) 

    </s:VGroup> 
    <mx:Image ... /> 
</mx:Canvas> 

दूँगी कि तुम इस तरह headingText में पारित:

<my:MyComponent headingText="Custom Heading Text" /> 

आप अन्य सरल मूल्यों आप में पास करना चाहते हैं के लिए एक ही दृष्टिकोण का पालन कर सकते हैं; बस एक सार्वजनिक संपत्ति घोषित करें, इसे बाध्य करने योग्य बनाएं, फिर अपने घटक के भीतर, संपत्ति को अपने गंतव्य (या गंतव्यों) में हुक करने के लिए डेटा बाइंडिंग का उपयोग करें।

आप जटिल गुणों (जैसे आपके इंस्टॉलेशन एमएक्सएमएल) के लिए भी वही कर सकते हैं। यह इस तरह दिखता है, जब आप इसे का उपयोग करें:

<my:MyComponent> 
    <my:thePropertyName> 
    <s:Label text="whatever..." ... /> 
    <(OTHER MXML CONTENT) /> 
    </my:thePropertyName> 
    <my:someOtherPropertyName> 
    .... 
    </my:someOtherPropertyName> 
</my:MyComponent> 

यह कैसे लागू करने के लिए, आप यह पता spark.components.Group घटक के mxmlContent संपत्ति फ्लेक्स ढांचे में जाँच कर सकते हैं का एक उदाहरण के लिए। यहां पोस्ट करने के लिए स्रोत बहुत लंबा है, और मुझे सीधे स्रोत पर ऑनलाइन लिंक नहीं मिल रहा है; लेकिन मूल विचार यह है (आप सभी एक MXML फ़ाइल में एक <fx:Script> ब्लॉक के अंदर निम्न कर सकते हैं - आप ऐसा करने के क्रम में एक शुद्ध वर्ग के रूप में बनाने की जरूरत नहीं है):

[1] घोषित उस प्रकार को इंगित करने के लिए मेटाडाटा ArrayElementType के साथ Array टाइप करें, जिस प्रकार आप सरणी रखना चाहते हैं।

[ArrayElementType("mx.core.IVisualElement")] 
public function set mxmlContent(value:Array):void { 
    _mxmlContent = value; 
} 
private var _mxmlContent:Array; 

[2] आप कार्यावधि में सरणी पर पाश करने के लिए तर्क का एक छोटा सा की जरूरत है, और घटक के प्रदर्शन की सूची पर सरणी की सामग्री को जोड़ देंगे। createChildren ओवरराइड इसे ट्रिगर करने के लिए एक अच्छी जगह है। निम्नलिखित setMXMLContent() स्पार्क Group की विधि के कार्यान्वयन से कम से कम व्युत्पन्न किया गया है। यह सब संभव मामलों को कवर नहीं करता है, लेकिन यह आप मिल शुरू कर दिया जाएगा:

:

override protected function createChildren():void { 
    super.createChildren(); 
    if(_mxmlContent == null) return; 
    for (i = 0; i < _mxmlContent.length; i++) { 
     var elt:IVisualElement = _mxmlContent[i]; 
     addElement(elt); 
    } 
} 

तो अब अपने घटक एक संपत्ति mxmlContent कहा जाता है, जो आप सिंटैक्स का उपयोग एक माता पिता MXML घटक से सेट कर सकते हैं के लिए होता है

<my:MyComponent> 
    <my:mxmlContent> 
     ... (MXML ELEMENTS HERE) ... 
    </my:mxmlContent> 
</my:MyComponent> 

मेटाडाटा: [DefaultProperty("mxmlContent")] आपके घटक वर्ग को लागू करके आप अपनी नई संपत्ति default property में अपने घटक बना सकते हैं। एमएक्सएमएल से ऐसा करने के लिए, बस मेटाडेटा परिभाषा को <fx:Metadata> तत्व में लपेटें। see here for example of fx:Metadata


सभी को एक साथ ऊपर डाल दिया, और आप कुछ आप इस तरह उपयोग कर सकते हैं मिल जाएगा:

<my:MyComponent headingText="Custom Text Here"> 
    (CUSTOM MXML CONTENT HERE) 
</my:MyComponent> 

संपादित करें:

: मैं नोटों की एक जोड़ी यहाँ बनाना चाहिए
  1. "हेलो" घटक (जैसे mx:Canvas)का समर्थन नहीं करते हैंऊपर इस्तेमाल किए गए अनुसार, तो आप शायद इसके बजाय addChild() का उपयोग करना चाहेंगे।

  2. आपको (शायद) हेलो घटकों के बजाय स्पार्क घटकों का उपयोग करना चाहिए। मतलब, <s:Group> का उपयोग <mx:Canvas> के बजाय अपने आधार के रूप में करें। यदि आप ऐसा करते हैं, तो आपका घटक ऊपर वर्णित mxmlContent संपत्ति का उत्तराधिकारी होगा। यदि आप चाहते हैं कि आपके घटक की अपनी "सामग्री" संपत्ति (या यहां तक ​​कि एकाधिक सामग्री गुण) हो, तो बस उन्हें कुछ अलग नाम दें।

+0

ठीक है, यह वास्तव में एक * संकलन-समय * समाधान नहीं है, लेकिन हो सकता है कि रन-टाइम प्रोसेसिंग से बचा जा सके। आप निश्चित रूप से बहुत धन्यवाद के लायक हैं और चूंकि कोई और करीब नहीं आया है, इसलिए मैं इस जवाब को स्वीकार करूंगा। – W3Coder

+0

@ डब्ल्यू 3 कोडर: स्वीकार करने के लिए धन्यवाद। मुझे पता है कि आप एक संकलन समय समाधान चाहते थे, लेकिन - अपने कोड जनरेटर के निर्माण के शॉर्ट - वहां पहुंचने का कोई रास्ता नहीं है। हालांकि इसके लायक होने के लिए: यह वही दृष्टिकोण है जो कि बाल सामग्री से निपटने के लिए फ्लेक्स फ्रेमवर्क द्वारा उपयोग किया जाता है, इसलिए इस तरह से लिखे गए आपके घटकों को उतना ही कुशल होना चाहिए जितना कि संकलन-समय समाधान होगा। सौभाग्य! कृपया वापस आएं और अगर आपको वहां कोई अलग/बेहतर समाधान मिल जाए तो हमें बताएं। – Lee

7

यह शानदार है। इस जानकारी के लिए धन्यवाद।

चूंकि मुझे इस पर इतना अधिक नियंत्रण की आवश्यकता नहीं है, इसलिए मैंने इस समाधान को थोड़ा सा सरल बना दिया है। हमारे कंटेनर MyComponent.mxml के लिए

कोड:

<s:Group ... > 
<fx:Script> 
    <![CDATA[ 

    [Bindable] 
    [ArrayElementType("mx.core.IVisualElement")] 
    public var content:Array; 

    ]]> 
</fx:Script> 

<s:Group width="100%" height="100%" mxmlContent="{content}" /> 

और उपयोग:

<myComponents:MyComponent 
    xmlns:myComponents="myComponents.*" 
> 

    <myComponents:content> 
     <s:Label /> 
     <s:Label /> 
     <AnythingWeWant... 
    </myComponents:content> 

</myComponents:MyComponent> 

आशा इस किसी को भी मदद करता है। चीयर्स।

+1

ग्रेट पोस्ट। मुझे जिस चीज की जरूरत थी! कामिल, अपना कोड पोस्ट करने के लिए धन्यवाद ... यह इस तरह से बहुत आसान है। – Ofir

+2

यदि आप ' [डिफ़ॉल्ट प्रॉपर्टी (" सामग्री ")]' MyComponent.mxml में जोड़ते हैं तो आप कक्षा का उपयोग करते समय '' टैग को हटा सकते हैं। ऊपर देखो। – Stephenr

संबंधित मुद्दे