Предупреждение Flex Mobile Project: невозможно выполнить привязку к свойству myData в классе com.amec.controls.Text::TextListView.

Итак, в проекте Flex Mobile я пытаюсь связать результаты запроса Select SQLLite с представлением. Но он не отображает результаты, и я получаю следующее

 warning: unable to bind to property 'myData' on class 'com.amec.controls.Text::TextListView'

Из FLash Builder. Ниже мой класс просмотра. Что я упускаю или делаю неправильно?

<?xml version="1.0" encoding="utf-8"?>
<amec:BaseAddView xmlns:fx="http://ns.adobe.com/mxml/2009" 
              xmlns:s="library://ns.adobe.com/flex/spark" 
              xmlns:amec="com.amec.Components.*"
              creationComplete="vw_creationCompleteHandler(event)" title="TextListView">
<amec:layout>
    <s:VerticalLayout horizontalAlign="center" paddingLeft="5" paddingRight="5" paddingTop="5" paddingBottom="5"/>
</amec:layout>
<fx:Script>
    <![CDATA[
        import com.amec.BaseSql;
        import com.amec.MenuMessage;

        import mx.events.FlexEvent;


        [Bindable]private var resultArr:ArrayCollection = new ArrayCollection();

        import mx.collections.ArrayCollection;


        protected function vw_creationCompleteHandler(event:FlexEvent):void
        {

        }

        private function get myData():ArrayCollection
        {

            var conn:BaseSql = new BaseSql();
            conn.stmt.text = "SELECT DMV_VALUE_1 FROM DOMAIN_VALUE WHERE DMV_DMN_ID = :id";
            x.parameters[":id"] = id;
            x.sqlConnection = conn.stmt.sqlConnection;
            var x:SQLStatement = new SQLStatement;

            x.text = conn.stmt.text;

            x.execute();
            var result:Array = conn.stmt.getResult().data;
            var r:ArrayCollection = new ArrayCollection();


            if (result)
            {      
                r.source = result;        
                return r;
            } else {
                return null;
            }


        }

    ]]>
</fx:Script>
<s:List id="list" top="0" bottom="0" left="0" right="0" 
        dataProvider="{myData}" labelField="DMV_VALUE_1">
</s:List>

<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>

Also I am not getting any results to show up in the view.


person yams    schedule 27.08.2013    source источник


Ответы (1)


Сначала задайте для свойства значение Bindable:

[Bindable(event="myDataChanged")]
private function get myData():ArrayCollection{
 ...
}

Поскольку у вас нет определенного метода "set". Таким образом, всякий раз, когда изменяется «myData», вам придется вручную отправлять событие myDataChanged, чтобы Bindable оказал влияние.

Я подозреваю, что вам также придется сделать myData() публичным свойством; иначе как классы, выполняющие привязку, смогут вникнуть в ваш пользовательский компонент, чтобы получить доступ к свойству.

В целом, похоже, что вы выбираете очень плохой подход к реализации. Необычно ли использовать метод get для вызова базы данных и обработки результатов? Гораздо чаще инкапсулировать такой код вне вашего представления; и передать данные результата в представление. Есть много разных способов сделать это. Вы можете сделать это с помощью одноэлементного подхода, инфраструктуры внедрения зависимостей или отправки событий из класса обслуживания с данными результата.

person JeffryHouser    schedule 27.08.2013
comment
Итак, я добавил связываемое событие, но результаты запроса не отображаются в представлении. Что я здесь сделал не так? - person yams; 27.08.2013
comment
Вы выполнили свой код, чтобы убедиться, что метод get отправлен? Отправляется ли когда-нибудь событие myDataChanged? Если не; тогда Binding никогда не вступит в силу. - person JeffryHouser; 27.08.2013
comment
Я прошел код, и он никогда не идет дальше x.parameters[:id] = id;. - person yams; 27.08.2013
comment
Извините, я исправил это, но он застрял на var result:Array = conn.stmt.getResult().data; - person yams; 27.08.2013
comment
Если он никогда не идет дальше определенной строки кода; это означает, что в вашем коде есть ошибка, которую нужно исправить. У вас установлена ​​отладочная версия Flash Player, чтобы вы могли видеть полную трассировку стека ошибки? - person JeffryHouser; 27.08.2013
comment
Да, но, видимо, кто-то переопределял ошибки, чтобы они не появлялись в определенных случаях, и поэтому эта ошибка не показывалась. - person yams; 27.08.2013
comment
Я не уверен, какие переопределяющие ошибки. означает. Но ошибки могут быть обнаружены либо с помощью обработчика uncaughtException, либо с помощью блока try/catch. Это может быть то, что происходило с вами. Если возможно, я рекомендую модифицировать код для отображения информации пользователю (или себе) при обнаружении такой ошибки. - person JeffryHouser; 27.08.2013
comment
По сути, кто-то кодировал безобидные ошибки, чтобы их не поймали. Но независимо от того, я исправил это. - person yams; 27.08.2013