2010-09-08 43 views
1

我正在使用Zend AMF从PHP应用程序中提取一些数据。不过,我无法将数据绑定到简单的DropDownList控件。 PHP方法是:无法将数据绑定到Flex 4中的DropDownList控件

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

网络监视器报告该方法正在返回结果。它返回以下为数组:

​​

下面是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> 

任何帮助将不胜感激。提前致谢。

+0

当你把'var a:Array = e.result as Array; trace(a.length,a [0],a.join());'在行上面''propertyList.dataProvider = e.result as Array;' – Amarghosh 2010-09-08 13:27:20

+0

我在两种方法下运行; myMethod = 1,另一个方法= 528。 – Reado 2010-09-08 13:41:35

回答

4

你问关于绑定,但我不认为这就是你想知道的。我相信答案是在结果处理程序中的这一行:

searchType.dataProvider = e.result as ArrayCollection; 

我假设您从ColdFusion获取数组。如果内存服务于我,则不能将数组转换为ArrayCollection。结果很可能是空的。你有没有在调试模式下逐步验证代码?

相反试试这个:

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> 

我写在浏览器的所有代码,它可能不是“完美编译”

0

@Flextras

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

。 ..resulted在...

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/

+0

正如我在回答中所说:“可能你需要将e.result(一个通用对象)作为一个数组,但我不这么认为。”我敢打赌,这将工作:searchType.dataProvider = new ArrayCollecection(e.result as Array);.如果您认为我的回答对您有帮助,请务必将其标记为正确,并/或给予优惠。 – JeffryHouser 2010-09-08 17:15:24

+0

我已经将它标记为正确并且投了票。谢谢你的帮助。 – Reado 2010-09-09 14:34:30

+0

我很欣赏Karma的积分;谢谢! – JeffryHouser 2010-09-09 15:04:34

相关问题