لا يمكن ربط البيانات بعنصر التحكم في القائمة المنسدلة في Flex 4

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

سؤال

أنا أحضر بعض البيانات من تطبيق PHP باستخدام Zend AMF. ومع ذلك ، لا يمكنني الحصول على البيانات لربط تحكم SimplownList Simple. طريقة PHP هي:

class Test
{
    public function myMethod()
    {
        $res = array();
        $res[] = array('NAME' => 'ThisIsATest', 'ID' => 1);
        return $res;
    }
}

تقارير شاشة الشبكة عن أن الطريقة تعود إلى النتائج. إنها تعيد ما يلي كصفيف:

Array
(
    [0] => Array
        (
            [NAME] => Property
            [ID] => 1
        )
)

فيما يلي رمز Flex:

<?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"
                       width="500" height="286"
                       creationComplete="initApp()">
    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;

            private function myMethodResult(e:ResultEvent):void
            {
                searchType.dataProvider = e.result as ArrayCollection;
            }

            protected function initApp():void
            {
                service.myMethod();
            }

            protected function faultHandler(event:FaultEvent):void
            {
                trace(event.fault.faultString);
            }
        ]]>
    </fx:Script>
    <fx:Declarations>
        <s:RemoteObject id="service"
                        destination="zend"
                        source="Test"
                        showBusyCursor="true"
                        fault="faultHandler(event)">
            <s:method name="myMethod" result="myMethodResult(event)"/>
        </s:RemoteObject>
    </fx:Declarations>
    <s:DropDownList id="searchType" labelField="NAME"/>
</s:WindowedApplication>

أي مساعدة سيكون موضع تقدير كبير. شكرا مقدما.

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

المحلول

أنت تسأل عن الربط ، لكنني لا أعتقد أن هذا ما تريد معرفته. أعتقد أن الجواب هو هذا الخط في معالج النتائج:

searchType.dataProvider = e.result as ArrayCollection;

أفترض أنك ستعود إلى مجموعة من Coldfusion. إذا كانت الذاكرة تخدمني ، فلن تتمكن من إلقاء صفيف كأركان. سوف تكون النتيجة ، على الأرجح ، لاغية. هل صعدت عبر الكود في وضع التصحيح للتحقق؟

بدلاً من ذلك ، جرب هذا:

searchType.dataProvider = new ArrayCollecection(e.result as Array);

نظرًا لأن E.Result كائن عام ، فستحتاج إلى إلقاءه كصفيف.

لمعالجة الجزء الملزم من إجابتك. الربط لديه مصدر وقيمة. عندما يتغير المصدر ، يتم تحديث القيمة تلقائيًا. لديك قيمة (dropdownlist.dataprovider) التي تريد تغييرها ، لكن ليس لديك مصدر لذلك. لا شيء في الكود الخاص بك يستخدم الربط. أنت فقط تضع القيمة يدويًا عندما تعود النتائج. للاستفادة من الربط ، قد أقوم بتعديل الكود الخاص بك مثل هذا:

    <?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"
                           width="500" height="286"
                           creationComplete="initApp()">
        <fx:Script>
            <![CDATA[
                import mx.collections.ArrayCollection;
                import mx.rpc.events.FaultEvent;
                import mx.rpc.events.ResultEvent;

// create a variable taht can be used as the source for a binding operation
[Bindable]
public var mySource : ArrayCollection;

                private function myMethodResult(e:ResultEvent):void
                {
//                    searchType.dataProvider = e.result as ArrayCollection;
// change the value of your binding source
mySource = new ArrayCollection(e.result);
                }

                protected function initApp():void
                {
                    service.myMethod();
                }

                protected function faultHandler(event:FaultEvent):void
                {
                    trace(event.fault.faultString);
                }
            ]]>
        </fx:Script>
        <fx:Declarations>
            <s:RemoteObject id="service"
                            destination="zend"
                            source="Test"
                            showBusyCursor="true"
                            fault="faultHandler(event)">
                <s:method name="myMethod" result="myMethodResult(event)"/>
            </s:RemoteObject>
        </fx:Declarations>
<!-- and finally, specify your dataProvider as the target for binding -->
        <s:DropDownList id="searchType" labelField="NAME" dataProvider="{this.mySource }"/>
    </s:WindowedApplication>

لقد كتبت كل الكود في المتصفح وقد لا يكون "تجميعًا مثاليًا"

نصائح أخرى

flextras

searchType.dataProvider = new ArrayCollecection(e.result);

...أسفرت...

1118: Implicit coercion of a value with static type Object to a possibly unrelated type Array.

بدلا من ذلك حاولت ...

searchType = ArrayCollection(e.result);

لكن هذا أدى إلى ...

Error #1034: Type Coercion failed: cannot convert []@812a1c9 to mx.collections.ArrayCollection

ثم حاولت ...

typeArray.source = e.result as Array;

...و...

<s:DropDownList labelField="NAME">
    <s:ArrayCollection id="typeArray"/>
</s:DropDownList>

هذا يعمل! o/

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