因此,在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>
此外,我没有在视图中显示任何结果。
答案 0 :(得分:2)
首先,将属性设置为Bindable:
[Bindable(event="myDataChanged")]
private function get myData():ArrayCollection{
...
}
由于您没有定义'set'方法。因此,每当“myData”发生更改时,您将不得不手动调度myDataChanged事件,以便Bindable产生影响。
我怀疑你还必须将myData()作为公共财产;否则,进行绑定工作的类将如何能够内省到您的自定义组件中以访问该属性。
总的来说,看起来您选择了一种非常糟糕的实施方法。使用get方法进行数据库调用并处理结果是不常见的。将这些代码封装在您的视图之外更为常见;并将结果数据传递到视图中。有很多不同的方法可以做到这一点。您可以使用单例方法或依赖注入框架,或使用结果数据从服务类调度事件。