Невозможно привязать данные к элементу управления DropDownList в Flex 4 - PullRequest
1 голос
/ 08 сентября 2010

Я получаю некоторые данные из приложения PHP, используя Zend AMF. Однако я не могу связать данные с простым элементом управления DropDownList. 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>

Любая помощь будет принята с благодарностью. Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 08 сентября 2010

Вы спрашиваете о связывании, но я не думаю, что это то, что вы хотите знать.Я полагаю, что ответом является следующая строка в обработчике результатов:

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 голосов
/ 08 сентября 2010

@ 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>

Это работает!\ О /

...