لا يمكن ربط البيانات بعنصر التحكم في القائمة المنسدلة في Flex 4
-
01-10-2019 - |
سؤال
أنا أحضر بعض البيانات من تطبيق 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/