كيف يمكنني إيقاف عنصر الصف الأول في datagrid من إنشاء مثيل/إضافة/تهيئة/إلخ مرتين؟

StackOverflow https://stackoverflow.com/questions/645323

سؤال

في الصف الأول من Flex DataGrid، سيتم تهيئة itemRenderer مرتين.يكشف تتبع النتائج أن الإطار المرن ربما يقوم بإنشاء مثيلين من عنصر الصف الأول itemRenderer.في تطبيق أكثر تعقيدًا، حيث يحتوي itemRenderer على ColorPicker مرتبط بالبيانات، نشهد حدوث حلقة لا نهائية بسبب هذه المشكلة.تتم تهيئة itemRenderer الخاص بالصف الأول فقط مرتين.هل هناك طريقة لتجاوز سلوك المرن ومنع حدوث ذلك؟يوضح التعليمة البرمجية التالية المشكلة:

التطبيق الرئيسي:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="on_initialize(event);">
<mx:Script>
<![CDATA[
/**
 * This experiment shows how the first row's itemrenderer is instantiated/added/initialized twice.
 * We've never even noticed this before we found that a data-bound ColorPicker enters a infinite
 * loop when it is within an itemRenderer.
 */
    import mx.collections.ArrayCollection;
    import mx.events.FlexEvent;

    private var dg_array:Array;
    private var dg_arrayCollection:ArrayCollection;

    private function on_initialize(event:FlexEvent):void {
        dg_array = new Array();
        dg_arrayCollection = new ArrayCollection();
        dg_arrayCollection.addItem("item 1");
        dg_arrayCollection.addItem("item 2");

        dg.dataProvider = dg_arrayCollection;
    }
]]>
</mx:Script>
<mx:DataGrid id="dg" width="100%" height="100%" rowCount="5">
    <mx:columns>
        <mx:DataGridColumn headerText="Name" itemRenderer="SimpleItemRenderer"/>
    </mx:columns>
</mx:DataGrid>
</mx:Application>

عارض العناصر البسيطة:

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300" initialize="//on_initialize(event);">
<mx:Script>
    <![CDATA[
        import mx.events.FlexEvent;

        [Bindable]
        override public function set data(value:Object):void { _data = value; }                 
        override public function get data():Object { return _data; }
        private var _data:Object;

        private function on_initialize_textInput(event:FlexEvent):void {
            trace("initialize:event.target="+event.target+", " + _data); // runs twice, for the first item only

        }

        private function on_creationComplete_textInput(event:FlexEvent):void {
            trace("creationComplete:event.target="+event.target+", " + _data); // runs twice, for the first item only
        }
    ]]>
</mx:Script>
<mx:TextInput text="{data}" id="textInput" initialize="on_initialize_textInput(event);" creationComplete="on_creationComplete_textInput(event);"/>
</mx:Canvas>

الإخراج المختصر:

initialize: event.target = itemRenderers0.dg ... SimpleItemRenderer12.TextInput ، null تهيئة: event.target = itemrenderers0.dg ... simpleItemRenderer24.textinput ، createComplete: event.target = itemrenderers0.dg ... البند 1 تهيئة: event.target = itemrenderers0.dg ... SimpleItemRenderer29.TextInput ، null createComplete: event.target = itemrenderers0.dg ... SimpleIteMrender12 ، البند 2 creationComplet .TextInput ، البند 1

هل كانت مفيدة؟

المحلول

لم يتم تنفيذ itemRenderer بشكل صحيح، وقد يكون هذا هو سبب مشكلاتك

يجب أن تقوم طريقة مجموعة البيانات المتجاوزة بتعيين قيمة super.data = value.لا تحتاج إلى تنفيذ خاصية _data الخاصة بك حيث أن Flex Containers تقوم بتطبيق IDataRenderer وتمتلكها بالفعل.أعتقد، بدون تشغيل التعليمات البرمجية الخاصة بك، أنك تواجه مشكلة في ذاكرة التخزين المؤقت/إعادة التدوير.

ما أفضّل فعله عمومًا هو إنشاء ملف [قابل للربط] خاص myProperty:Object (عادةً ما يكون MyObjectVO مخصصًا يمتد إلى EventDispatcher).ثم، في طريقة مجموعة البيانات الخاصة بي، سأقوم بتعيين super.data = القيمة تليها if(value!=null) myProperty=value.

يتيح لي هذا كتابة بياناتي الفعلية بقوة، وترك الآليات سليمة فيما يتعلق بواجهة IDataRenderer التي يتم تنفيذها بواسطة Canvas (أو حاوية أخرى) ويضمن إعادة تدوير البيانات بشكل صحيح.

تعتبر تهيئة إنشاء الإعلان المكتملة من الأحداث السيئة في itemRenderers لأنه يتم إعادة تدويرها فعليًا ولا تتصرف هذه الطرق كما قد يتوقعها المرء أو يريدها.

لا أستطيع التعبير عن مدى فائدة هذه السلسلة من تأليف Peter Ent على موقع itemRenders كان بالنسبة لي.

نصائح أخرى

حسنا، وهو محق في ذلك، لدي نفس الأخطاء، ويسمى itemRenderer أولا مرتين، يمكنك ان ترى منصبي في المنتدى الرسمي هنا:

http://forums.adobe.com/thread/604259

ووشغل الخلل هنا:

https://bugs.adobe.com/jira/browse/SDK-26010

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top