本文来自:9RIA
(原文:Quick start: Create your first Force.com Flex desktop application)
作者:Jeanette Stallons 翻译者:skylark14/guagua
本教程在一个小时里将逐步向你介绍为Force.com用Flash Builder构建一个Force.com Flex桌面应用程序。在这个过程中你会了解到:
- 获取一个Force.com开发版编辑帐户(如果你还没有Force.com开发版,企业版或Unlimited帐户)
- 设置API访问salesforce.com上创建的一个脱机公文包中的数据;在salesforce.com站点上生成一个WSDL。
- 使用Flash Builder for Force.com来创建一个Flex AIR应用程序,可以取回,显示和编辑salesforce.com的数据。
- 打包和安装AIR应用程序。
目录[隐藏] |
需求
为了完成本教程,你需要以下准备:
- 一个Force.com 帐户:注册
- Adobe Flash Builder for Force.com:试用
- Adobe AIR runtime:下载
- 教程文件:qs_desktop_solution.zip (ZIP, 9.8 MB)
预备知识
你须要先熟悉下面的文章中的内容。
- Understanding the technologies for building Force.com Flex applications with Adobe Flash Builder for Force.com
- Understanding data management in applications built with Adobe Flash Builder for Force.com
数据库基础知识和面向对象编程的原则也是有用的。
配置访问salesforce.com的数据
完成时间:8分钟
在本节中,你要在salesforce.com网站设置桌面应用程序要访问的salesforce.com数据。你需要:
- 获取Force.com开发版帐户
- 设立脱机公文包配置,指定salesforce.com的子集数据能通过WEB服务调用可用的数据。
- 生成一个WSDL,你的应用程序需要通过Web服务访问salesforce.com的数据。
- 授予权限去访问salesforce.com数据。
如果你注册一个新的Force.com开发帐户,还没有添加任何数据到salesforce.com数据库中。这种类型的帐户,附带了一些预填充的数据,你可以看一看且可使用。
注册salesforce.com
为了建立的桌面应用程序可用web服务API访问salesforce.com数据,你必须有一个Force.com开发版,企业版,或不限帐户版。如果你还没有其中一个版本,现在就可以申请获得免费的开发版帐户。另外,继续设立脱机公文包。操作步骤:
- 打开浏览器并转到Developer Force sign-up website注册。
- 填写所有必填字段,然后点击Submit提交按钮。
- 打开你的电子邮件并等待,直到收到来自salesforce.com登录确认电子邮件。(你应该会在5分钟内收到电子邮件)
- 当你收到来自salesforce.com的电子邮件时,点击链接用你用户名和邮件中的临时密码进行登录。
- 在salesforce.com网页上,更改你的密码,然后点击Save保存按钮。你现在可以使用新的Force.com帐户了。
设置脱机公文包
为了从桌面应用程序访问数据,你需要建立一个脱机公文包(意思是salesforce.com网络应用脱机)。公文包是一个salesforce.com的子集数据,桌面应用程序利用Force.com API可访问的数据集。公文包配置是一组参数确定个别用户的公文包中可用记录或是特定的配置文件。 1.请登录到salesforce.com
2.点击该页面顶部的Setup链接(见图1)。
3.左侧工具栏菜单中,选择Administration Setup > Desktop Administration > Offline Briefcase Configurations(见图2)
4.如果你达到Introduction页面,点击Continue按钮(见图3)。
图3.设置脱机公文包配置
5.在New Offline Briefcase Configuration页面,点击New Offline Briefcase Configuration按钮。
6.在New Offline Briefcase Configuration页面上,在Name文本框中输入Stratus Briefcase,然后选择Active复选框(见图4)。
图4.创建一个新的离线公文包配置。
7.在Assign Users and Profiles部分中,确保Search设置为Users(见上图4)。
8.在Available Members列表中,选择User:Your Name在Assigned Members列表中(见上图4).而不是从桌面应用访问时才给出数据,你也可以指定个别其它的用户或是配置文件。
9.点击Save按钮。
10.在Stratus Briefcase页面上,在Data Sets部分点击Edit按钮(见图5)。
图5.为公文包设置一个数据集
11.在Data Sets页面上,点击Add按钮。
12.在Add a Data Set对话框中,选择Account并点击OK(见图6).
图6.选择数据集
Set Max Record Limit下面选择No Limit(见图7)。
13.在该文中你使用的帐户对象是唯一的。如果你想要其它数据集在你的桌面应用程序中可用,点击Data Sets链接,然后重复11–13步。
14.点击Done按钮。
生成一个WSDL
现在你已经创建了一个脱机公文包且指定哪些数据是桌面应用程序可访问的,你需要生成WSDL(Web服务描述语言)文件,该文件包含你的应用程序通过网络服务需要实际访问的数据信息。
注意:对于salesforce.com并不陌生,如果在数据集中包含有任意自定义对象,你必须在创建WSDL之前创建脱机公文包,因为WSDL生成时将包含所有标准对象的交互细节,但只有自定义数据对象在脱机公文包中需要指定。
1.工具栏菜单中转到App Setup > Develop > API.
2.单击Generate Enterprise WSDL链接(见图8)。你必须生成一个Enterprise WSDL,因为只有Enterprise WSDL能创建强类型对象,代表在你的数据库表中的记录。如果你使用自定义对象,同样也只有WSDL会包含用于访问自定义对象的详细信息。
图8. 生成一个enterprise WSDL.
3.在浏览器窗口中,你应该看到显示WSDL一个新的网页(见图9)。定位到标准的Account对象引用。
图9 显示生成的Enterprise WSDL.
4.在浏览器中,定位到菜单选项选择保存此网页并另存为salesforce.wsdl(或任何你想要的名称)到你计算机上某个位置。
5.点击Back后退按钮返回到salesforce.com。
授予访问数据权限
为了在Force.com Flex桌面应用程序能顺利登录,用户必须具有适当的权限。你必须在salesforce.com上设立一个脱机用户,并且必须在你公司信赖的网络中登记IP地址。
1.在工具栏菜单中,转到Personal Setup > My Personal Information > Personal Information。
2.验证被选中的脱机用户,如果不是受信任的,单击Edit更改该值,然后点击Save保存。
如果你没有在可信任的网络中,你可以组织信任的网络指定其它IP地址或是地址范围来访问数据。假设你有一个静态IP地址,如果没有静态IP地址,在你发出请求时要传递你的用户名与密码从而需要获得一个security token安全令牌。
注意:如果你不知道你是否在信任的网络中,可以跳过该节,稍后当你试图登录构建的应用程序时会收到一个错误再回到这里。如果你的是一个静态IP地址,但没有在你公司信赖的网络中,按照以下步骤完成设置:
1.在工具栏菜单中,转到Administration Setup > Security Controls > Network Access。
2.Network Access页面上,在Trusted IP Ranges部分点击New按钮(见图10)。
图10 添加信赖IP地址
3.输入起始IP与结束IP地址,接着点击Save按钮。
如果是一个动态的IP地址且不在可信任的网络中,完成以下步骤。
1.工具栏菜单中,转到Personal Setup > My Personal Information > Reset My Security Token(见图11)。
图11 重设你的security token安全令牌
2.点击Reset Security Token按钮。你的security token将邮寄到此帐户相关联的电子邮件地址中。
3.一直等到你收到来自salesforce.com包含安全令牌的电子邮件。一定要保存此电子邮件,在登录应用程序时你就会用到security token安全令牌。
现在你已经完成了salesforce.com所有必要的设置,开始准备建立取回/显示和修改salesforce.com数据的应用程序。
查看标准salesforce.com数据对象
如果你才接触salesforce.com,在完成了salesforce.com网站上设置,仔细看看来你帐户的默认表中的一些数据,然后定位到表格的名称,该字段是你通过网络服务API访问需要使用的。
所有Force.com帐户(除免费版)提出一个你可以使用的标准预置对象,包括Account帐户, Contact联系方式, Lead和许多条目。salesforce.com对象只是一个数据库表。对于开发版的帐户,这些表中已预先填充了一些数据,你可以用来构建你的第一个Force.com Flex应用。你可以自定义这些预置对象,也可以构建自定义对象(自定义数据库表),允许你存储应用程序的信息。关于使用salesforce.com数据的更详细信息请参考本文最后的文献。
1.工具栏菜单中,在App Setup (见图12)之下点击Customize,你将看到你帐户中已创建的对象列表(Leads, Accounts, Contacts等等)。在Customize下列出的所有项并不都是标准的对象,Fields子项是一个对象。
图12.查看标准对象
2.点击Accounts > Fields,接着查看预置对象的标准字段。(见图13)
图13.查看Account标准对象的字段
3.Field Label下,点击Account Name(见上图13),看到Field Name等于Name(见图14)。你将在Force.com Flex 应用中用API的Account.Name访问该字段。
图14查看一个对象的字段名称
4.点击Back to Account Fields链接,重复第3步查看其它Account下子项的字段名称。
结束查看此表中的样本数据。
1.在应用程序右上角选择下拉列表,选择Sales(见图15)。
图15 切换到Sales应用
2.点击Accounts标签(见图16)
图16 单击ccounts标签
3.在Accounts页面上,单击Go!按钮,接下来到看到下拉列表My Accounts。你会看到一个已存在的Account数据列表(见图17)。
图17 查看Account数据
4.点击Dickenson account name链接(或其它帐户名称的链接)去查看该帐户的详细数据。
5.离开当前打开的浏览器,稍后你将返回到salesforce.com站点。
创建一个基本的Force.com Flex 应用
完成时间:8分钟
现在,你在salesforce.com上已设置了API访问你的Account表,就可以使用Flash Builder for Force.com构建一个可取回,显示和编辑数据的应用程序。第一步是建立一个具有登录功能的基本的Force.com Flex桌面应用程序。
1.下载并安装Flash Builder for Force.com
注意:如果你已安装Eclipse或Flash Builder,你仍必须为安装Flash Builder for Force.com作为独立的Eclipse实例。Flash Builder for Force.com不能作为插件被Eclipse使用。
2.打开Flash Builder for Force.com
3.如果你看到欢迎屏幕,点击Welcome 标签上的X关闭它。
创建Force.com Stratus项目
在Flash Builder for Force.com中开始创建Force.com Stratus项目。当你创建项目时,必须指定名称,位置,ID和你的Force.com 帐户的WSDL位置。
1.从主菜单,选择File > New > Other
2.在New dialog 新建对话框中,展开Flash Builder选项,选择Force.com Stratus的项目,然后单击Next下一步按钮(见图18)。
: 图18:创建Force.com Stratus项目
3 在New Flex Project 对话框中,键入SalesforceAccounts作为项目名称。
: 图19。指定的Force.com Stratus项目的细节。
4 选择项目默认位置或浏览到一个新位置。
5 Application类型,选择Desktop(见上面图19)
注意:这个时候,你只能用Flash Builder for Force.com创建桌面应用程序,而不是WEB应用。
6 确定Flex SDK版本设置为Use default SDK采用默认SDK,Application server type设置为None/Other.
7 点击Next按钮
8 在Configure Output页面上,点击Next按钮
9 在Create a Flex project页面上,更改Application ID由SalesforceAccounts为com.yourdomain.SalesforceAccounts,例如,com.adobe.samples.SalesforceAccounts (见图20). 该application ID用于AIR运行时和操作系统用以标识应用程序。为了保证应用程序ID唯一性,在使用中普遍的命名约定采用反向域名表示法。
10 点击Finish按钮。该项目将会被创建,接着打开一个新的Connect to Data/Service对话框。耐心点——你可能需要等待一分钟左右或是出现一个新的对话框。
11 如果你得到的是一个Perspective Switch对话框,点击Yes切换到Flash perspective(Flash透视图)。
12.在出现的Connect to Data/Service对话框中,点击Browse按钮,浏览到你以前创建的企业级WSDL,另存为salesforce.wsdl(见图21)。WSDL的位置并不重要(它不需要放置到服务器上)因为它只引用一次在development time开发时以生成客户端ActionScript类,该类将在运行时通过Web服务请求用于访问salesforce.com数据。
13 点击Finish按钮。
14 一直等到对话框告诉你服务已被创建,然后在Package Explorer (见图22)定位到你新的SalesforceAccounts项目。Force.com Stratus 项目的两个MXML文件被自动地创建:SalesforceAccounts.mxml 和 MainWindow.mxml。
SalesforceAccounts.mxml是主程序文件。当用户登录成功,一个新的应用程序窗口被打开,并呈现MainWindow.mxml文件中指定的内容。你的大部分代码将会写在MainWindow.mxml文件中。
15 定位到代码编辑环境中查看SalesforceAccounts.mxml文件的代码。StratusApplication类是创建桌面应用Salesforce的具体实现。它扩展自AIR WindowedApplication类并提供其它的功能,包括登录用户界面和逻辑,本地数据库自动地建立同salesforce.com脱机公文包中配置同步数据,冲突管理服务,等等。
运行应用程序
该应用程序还没有任何内容(需要在稍后添加),但你可以测试登录功能。你可以从Flash Builder运行该程序并测试桌面应用是否正常。Flash Builder提供AIR Debug Launcher(ADL)工具用来测试应用程序的方法,而不必在开发期间每次代码更改后为了测试就编译,打包和安装成桌面应用。稍后你将学习到如何打包并安装桌面应用程序。
1 点击绿色的Run As按钮(见图23)
图23编译并运行你的应用程序
2 在Run As对话框中,选择Desktop Application 并点击OK按钮。你将看到你的应用程序在系统窗口中操作。(见图24)。该操作需要几分钟,因为在程序出现之前它首先需要编译。
图24:启动Force.com Flex桌面应用
注意:如果应用出错误你会收到一个对话框告诉你不能运行该程序。退回到Flash Builder,并查看代码窗口边缘具有红色X标记。将鼠标移至X看看是什么错误(或者在代码编辑器下面的Problems视图中查看错误),接着修复你的错误。
3 输入一个有效的用户名与密码再点击Login按钮。你会看到一个登录错误的消息。
4 点击OK返回到Authentication对话框,输入你正确的salesforce.com帐户名称与密码再点击Login按钮。
如果你是从你公司内信任网络中登录,应该会登录成功,但是接着会弹出安装错误消息告诉你不能链接到脱机数据库中指定的数据库并且应用程序需要访问它(见图25)。
图25在你的应用程序成功登录后得到安装错误提示
如果你是从公司非信任网络中登录,你将会得到“login must use security token”错误。若是收到错误你需要完成下面的步骤。
1)确保你完成了Grant permission to access data该节,如果你的是一个动态IP地址,需完成其余步骤。
2)转到电子邮箱,找到重置security token安全令牌时从salesforce.com发送给你的邮件。
3)返回到Salesforce.com Accounts Application并点击OK返回到Authentication对话框,重新输入你正确的用户名与密码,但这时密码追加了security token安全令牌(密码与安全令牌之间不要有空格),例如myPasswordmyToken.
4)重新点击Login按钮。这时你应该成功登录了,然后得到安装错误消息(见上图25)。
5)关闭该应用程序。
设置应用程序属性
接下来你需要做的事是设置该应用程序准备使用的salesforce.com对象。然后,为了在开发期间加快你的应用程序测试,将添加一个默认用户名与密码,因此你不必每次运行该应用程序时手动输入值,否则这样很快就会乏味了。
1.返回到SalesforceAccounts.mxml并更改StratusApplication 标签的requiredTypes属性的值,由"Account,Contact"调整为"Account".。如果你现在运行该应用程序就可以成功登录了。但在测试之前,为登录过程添加一些其它属性这样就不会出现Authentication身份验证对话框了。
2.为StratusApplication标签添加新属性defaultUsername并设置它等于你的salesforce.com帐户的用户名。
3.添加第二属性defaultPassword并设置它等于你的密码,或者若从公司非信任网络登录密码要追加安全令牌。如果你现在运行该应用程序,身份验证对话框中会预先填入这些值。
4.添加第三个新属性autoLogin并设置它等于true。现在你运行该应用程序,就根本不会出现Authentication对话框。
5.更改stratusName属性值由Stratus App为Salesforce.com Accounts Application.。当运行时该值会出现在应用程序中。
<stratus:StratusApplication xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:salesforce="com.salesforce.stratus.*" stratusName="Salesforce.com Accounts Application" stratusClass="services.stratus.Stratus" mainWindowClass="MainWindow" requiredTypes="Account" defaultUsername="myUsername" defaultPassword="myPassword" autoLogin="true" >
6.运行程序。
你应该不会再得到Authentication对话框。指定用户名与密码验证后你应用会看到应用程序窗口,有文本Your content goes here(见图26)。接下来给应用程序添加内容。记住这个自动登录仅用于测试的目的。在部署应用程序前请确保删除defaultUsername, defaultPassword, 和 autoLogin属性。
7.关闭程序
取回salesforce.com数据
完成时间:10分钟
接下来,用Stratus框架中的类取回salesforce.com数据。若要用salesforce.com数据进行交互,你要用到StratusWrapper类(com.salesforce.stratus.StratusWrapper)中的方法。你可以用query()方法从本地存储数据中取回数据,save()和deleteItem()两个方法可以更新本地存储和Force.com的数据。你不能直接用生成的Web服务代理类(指的是services.stratus包)进行这些调用。相反,使用StratusWrapper类在幕后用这些类进行Web服务调用。
注意:更多详细信息请参考Language Reference for Stratus framework. Stratus框架语言参考文档
1.在SalesforceAccounts.mxml文件中,定位到StratusApplication 标记中的mainWindowClass属性并查看其值。
2.在Package Explorer中,双击MainWindow.mxml打开它,该文件的根标签,Window (spark.components.Window)是AIR在桌面应用程序中用于创建一个新的操作系统窗口的指定类。
3.如果您没有看到行号,在代码左侧的标记栏上右击,选择Show Line Numbers。
取回数据
在本节中,你将使用StratusWrapper类的query()方法来取回数据。需要给query()方法传递两个参数,一个SQL执行字符串和用来处理查询调用成功或失败的响应函数。
1.在代码块中,创建一个类型为StratusWrapper名称为stratusWrapper的私有变量。在编写该类时确保从代码提示中选择StratusWrapper类,才会自动地导入该类。(参见图27)。
2.在onWindowComplete()函数中。 StratusWrapper是一个单例,你可以用getInstance()静态方法获取实例的引用,在这里用_stratusWrapper变量记录引用。
private function onWindowComplete():void { new StratusMessage(StratusMessage.STATUS_INFO, "Application initialized").showAsStatus();
_stratusWrapper=StratusWrapper.getInstance();
}
3.在onWindowComplete()函数中,调用StratusWrapper的query()方法并传递一个要查询本地存储数据的字符文本值,该查询语句必须使用SOQL进行编写,SOQL是一门Salesforce.com Object Query Language对象查询语言。
private function onWindowComplete():void { new StratusMessage(StratusMessage.STATUS_INFO, "Application initialized").showAsStatus(); _stratusWrapper=StratusWrapper.getInstance(); _stratusWrapper.query("select * from Account order by Name"); }
4.query()方法的第二个参数,创建一个StratusResponder类实例并指定一个名为onAccountQueryResult函数来处理结果,不需要处理fault失败可传递handler (null)。确保编写时从代码提示中选择StratusResponder类会自动导入该类。
import com.salesforce.stratus.StratusResponder; private function onWindowComplete():void { new StratusMessage(StratusMessage.STATUS_INFO, "Application initialized").showAsStatus(); _stratusWrapper=StratusWrapper.getInstance(); _stratusWrapper.query("select * from Account order by Name",new StratusResponder(onAccountQueryResult,null)); }
通过设置fault失败响应的处理器为null,表明不需要fault失败处理器。大多数Stratus异步方法会自动地为用户在Stratus status bar中提供消息。如果你想在查询失败后执行其它逻辑,你就需要指定fault失败处理器,且在其中执行其它代码,包括为用户提供消息。
注意:你可能会在预发布版本中看到自动生成的导入语句有一些古怪的行为。当你从代码提示中选择一个类,Flash Builder可能会生成新的导入语句,但会删除已存在的导入语句,如果发生这种情况,你将需要手动键入其余的导入语句。
5.在Script块中完成onWindowComplete()方法后,创建一个名为onAccountQueryResult私有函数用来接收ArrayCollection类型的参数数据并且什么都不返回。调用查询返回一个ArrayCollection类型的数据,在这种情况下,每条数据为Account帐户对象。ArrayCollection类是Flex框架内置类,实质上是封装了一个Array,它可以监测其中内容的变化。确保从代码提示中选择ArrayCollection导入该类。
import mx.collections.ArrayCollection; private function onAccountQueryResult(data:ArrayCollection):void{ }
6.在Window选项卡中,定位到windowComplete,为Window窗口的windowComplete事件注册一个名为onWindowComplete监听函数,该事件一旦在对象属性被设置,所有子对象实例化及其属性被设置,所有对象大小和位置确定,并且底层native operating system window已经被创建的情况下才广播windowComplete事件。
windowComplete="onWindowComplete()"
用调试器查看数据使用情况
在你编写任何显示代码前,一个很好的实践是使用Flash Builder debugger来查看调用查询返回的数据。
1.点击上方主工具栏上的Debug按钮(见图28)。应用程序会运行,然后会得到如下所说窗口。
图28 调试该应用程序
2.关闭该应用程序
3.返回到Flash Builder for Force.com。你会看到在IDE下方的Console视图(见图29)显示了应用程序在运行时发生的进程列表:用户登录,创建本地数据库(前提是用户登录成功),并在创建成功后连接它;如果该应用程序是在线的,本地数据会与Force.com上的数据进行同步,最后,你的查询是从本地存储数据中进行。
图29 在Console视图中查看调试信息
4.在onAccountQueryResult()函数内的空行处通过双击左侧标记栏上添加断点(图30)。你会在该行的标记栏旁边看到一个蓝色圆圈。你可以在标记栏中双击该断点移除它,或是右击该断点再选择Toggle Breakpoint。
图30双击添加断点
5.调试该应用。你需要返回到Flash Builder debugging perspective,你可能会收到一个对话框,询问你是否要切换到debugging perspective。如果你不立即返回到Flash Builder,在你的任务栏或dock选择其任务。
6.如果你收到Confirm Perspective Switch对话框,选择Remember my decision复选框点击Yes,这样你每次调试应用程序都不用会现该对话框。Flash Builder切换到debugging perspective(见图31)。
图31 查看debugging perspective.
7.点击右上方Flash标签切换到development perspective。(见图30)
图32在开发与调试视图之间切换
8.点击右上角Flash Debug选项卡返回到debugging perspective(见上图32)。如果你两个选项卡都没有看到,点击选项卡的左边缘并拖动到左侧。
9.单击Variables选项卡(见图33),你应该会看到两个变量:this和data。this指的是窗口实例MainWindow,data指的是onAccountQueryResult()函数的参数,一个ArrayCollection类的实例。
图33 查看Variables 选项卡
10.双击Variables选项卡可以在Flash Builder中全屏查看。
11.接下来点击data.你会看到所有属性和ArrayCollection实例中的值。(见图34)
图34 查看对象的属性与值
12.单击展开数组第一项[0],第一个Account实例。你会看到一个名为[inherited]的节点,默认情况下,父类成员单独分组为一个叫[inherited]节点,以帮助减少一次性可看到的变量数量。
13.单击数组的[inherited]。你会看到属性旁边有红色正方形,表明它们是私有属性。
14.下拉,直到你看到绿色圆球表明公开属性:AccountNumber, AnnualRevenue, BillingCity,等等(见图35)。
图35定位data到第一个account
15.双击Variables选项卡在Flash Builder中回到原始尺寸。
16.点击红色Terminate按钮终止调试会话。
17.点击右上角的Flash选项卡切换到development perspective开发透视图。
显示salesforce.com 数据
完成时间: 10 分钟
现在你已经成功的获取了salesforce.com的数据,接下来要做的就是在程序中显示这些数据。Stratus框架为你提供了几个显示和编辑数据的组件,让你的工作变得很容易。你可以对你每个对象的一个域使用LabelAndField (com.salesforce.stratus.LabelAndField) 组件。LabelAndField组件能够处理显示,格式化,编辑和验证指向的域。如果你希望显示一个对象的多个域,你可以将多个LabelAndField组件放进一个FieldContainer (com.salesforce.stratus.FieldContainer)。当你从查询中得到结果时,可以使用render()方法来激活这些组件。
1.返回MainWindow.mxml文件。
2.删除标记中的<s:Label/>。
显示一个条目的一个域
首先我们使用一个LabelAndField组件来显示一个域。
1.在Vgroup标记内, 添加一个LabelAndField标记,命名为nameField。
<s:VGroup width="100%" height="100%" paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10"> <stratus:LabelAndField id="nameField"/>
2.设置LabelAndField 域属性为Account.Name,表示了你希望在域中显示的对象。
<stratus:LabelAndField id="nameField" field="Account.Name"/>
注意: LabelAndField类包含了Stratus FieldElement 组件 (com.salesforce.stratus.FieldElement)和一个Flex 的Label。如果你不希望显示域文本而只希望有LabelAndField的功能,那可以使用FieldElement来替换。
3.在onAccountQueryResult() 函数内部,使用LabelAndField的 render()函数来显示返回的查询的第一个条目的名字。
private function onAccountQueryResult(data:ArrayCollection):void{ nameField.render(data[0]); }
4.运行程序。你应当能看到第一个客户的名称显示了(如图 36)。
图36. 显示客户名称。
5.关闭应用程序。
显示一个条目的多个域
为了显示一个对象的多个域,将多个 LabelAndField 组件放在FieldContainer内部。
1.在Vgroup内部,再增加两个LabelAndField 组件用来显示客户对象的AnnualRevenue 和 Billing Address域。你也可以将id域从第一个组件中取消掉,它已经没用了。Billing Address 域 (其中有一个空格) 是salesforce.com中的一个混合或者虚拟域。它不是直接和一个真实的域相对应,而是几个域的组合。
<salesforce:LabelAndField field="Account.Name"/> <salesforce:LabelAndField field="Account.AnnualRevenue"/> <salesforce:LabelAndField field="Account.Billing Address"/>
2.将LabelAndField组件放进Vgroup组件中的FieldContainer。你可以直接在FieldContainer中调用render而不需要对每个域都调一次render。
3.给FieldContainer一个实例名 accountContainer ,设置它的宽和高为100%.。
<stratus:FieldContainer id="accountContainer" width="100%" height="100%"> <stratus:LabelAndField field="Account.Name"/> <stratus:LabelAndField field="Account.AnnualRevenue"/> <stratus:LabelAndField field="Account.Billing Address"/> </stratus:FieldContainer>
4.在onAccountQueryResult() 函数中,将render的代码替换到新的FieldContainer中。FieldContainer 并没有render()函数,但是它有一个fieldCollection (com.salesforce.salesforce.FieldCollection的一个实例)属性拥有这个函数。FieldCollection 管理着在容器中显示的数据。
private function onAccountQueryResult(data:ArrayCollection):void{ accountContainer.fieldCollection.render(data[0]); }
5.运行程序。你应该能看到第一个客户的Name, AnnualRevenue和 Billing Address 域 (如图 37)。
图37. 显示第一个客户的多个域
6.关闭应用程序。
添加一个组件,能够切换客户
接下来,添加一个Flex DropDownList 组件 (spark.components.DropDownList) 来切换客户。
1.在代码块内,创建一个bindable,私有变量_accounts, 类型是ArrayCollection。这个变量保存有所有的取得的客户数据。它需要使用bindable,这样所有的绑定到它的所有视图都可以实时更新。如果你刚刚接触这个概念,参考本文后面的引文。
[Bindable] private var _accounts:ArrayCollection;
2.在 onAccountQueryResult() 函数内部,设置_accounts 变量等于返回的查询数据。
private function onAccountQueryResult(data:ArrayCollection):void{ accountContainer.fieldCollection.render(data[0]); _accounts=data; }
3.在Vgroup的第一个子节点内,添加一个DropDownList 组件,设id为accountList。
< s:VGroup width="100%" height="100%" paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10"> <s:DropDownList id="accountList"/> <stratus:FieldContainer id="accountContainer" width="100%" height="100%">
4.设置 DropDownList 的dataProvider 属性等于你创建的_accounts 变量。使用数据绑定{} 将它的值与动态数据绑定在一起,这样就能够在运行时实时的更新。
<s:DropDownList id="accountList" dataProvider="{_accounts}"/>
5.设置 DropDownList 的labelField 属性为 Name,这是你希望显示的客户对象的属性。如果你没有设置这个属性, [Object Account] 将会把所有客户显示在DropDownList 中。
6.将DropDownList 的宽度属性设为300 ,这样它就足够大了。
7.设置DropDownList 的change事件的监听器,事件处理函数设为onListChange。将事件对象传给数据处理函数。
<s:DropDownList id="accountList" dataProvider="{_accounts}" labelField="Name" width="300" change="onListChange(event)"/>
8.在代码块内,创建一个私有函数onListChange ,里面有一个IndexChangeEvent 类型的参数,返回类型void。 IndexChangeEvent 是当DropDownList 更改事件触发的一种事件类型。确保你从代码提示中选择了IndexChangeEvent。
import spark.events.IndexChangeEvent; private function onListChange(e:IndexChangeEvent):void{ }
9.在onListChange() 函数中,渲染在DropDownList中选中的FieldCollection 的客户。这会改变LabelAndField 组件中显示的客户数据。
accountContainer.fieldCollection.render(e.currentTarget.selectedItem);
10.在onAccountQueryResult() 函数内,将DropDownList 的selectedIndex 设为第一个客户。
accountList.selectedIndex=0;
11.在 onAccountQueryResult() 函数内,注释或者删除第一行代码,它是用来渲染FieldContainer的第一个客户数据的。因为当你设置DropDownList 的selectedIndex 为0的时候onListChange()函数已经更新了数据。
private function onAccountQueryResult(data:ArrayCollection):void{ _accounts=data; accountList.selectedIndex=0; }
12.运行程序。你应当能够看到一个DropDownList 下拉框,其中第一个客户被选中了(如图 38)。
图 38. 在DropDownList 中显示所有的客户。
13.在 DropDownList选择一个新客户,你可以看到新客户的详细信息。
14.让程序开着,接下来我们还要继续使用。
编辑 salesforce.com 的数据
完成时间: 20 分钟
除了显示和格式化对象域的数据,LabelAndField (和 FieldElement) 组件还提供了几项功能,包括编辑域的值,验证新输入的值,如果验证失败了还能给用户提供错误信息。当用户有新的输入数据,新值必须被显式的提交给本地数据库和Force.com 云。
使用LabelAndField 组件编辑数据
你可以使用 LabelAndField 组件来编辑数据。
1.如果程序没有打开,那就运行它。
2.将鼠标移过Annual Revenue 域。你将在右边看到一个铅笔图标 (编辑按钮) (如图 39)。
: 图 39.得到一个域的编辑按钮
3.双击Annual Revenue域的值或者点击编辑按钮来编辑这个数据域。注意到出现的撤销按钮能够将值设为初始的值(如图40)。
: 图 40. 改变域的值
注意:如果你编辑的一个域是必须存在的,一个垂直的红线就会出现在输入框的左边,正如salesforce.com上面一样。
4.修改数值。
5.点击Account Name 域的值或者点击回车。当你的焦点离开你更改的域,你更改的数值就会变成橙色,而且自动格式化(如图 41)。和在salesforce.com上一样,橙色的值表示一个数值被更改了,但是还没有被保存。当一个域显示橙色的时候,你能使用撤销按钮让它回到初始值。
: 图 41. 查看一个更改的域
6.再次双击Annual Revenue域的值,这次改成一个无效的值,比如"new"。 7.点击Account Name域的值,改变焦点。你应该能看到橙色的值和一个错误信息(如图42)。
图42. 查看一个无效的值和错误信息
8.多次编辑Annual Revenue的数值,然后给它赋一个新的有效值。
9.双击Billing Address Revenue域的值,出现一个弹出窗口,让你编辑每一个域的值(如图43)。
图 43. 改变组件中的值
10.改变Billing Address域的一个值,点击Ok。你能看到多个域被更改了(如图44)。
图 44. 查看多个域的更改。
11.关闭程序。
12.再次运行程序。你应该看得的还是旧值,而不是你输入的新值。因为新值并没有被保存。
13.关闭程序。
改变LabelAndField 的编辑模式
在保存数据之前,让我们看一下第二个编辑模式。LabelAndField 组件其实有两个编辑域数据的模式:内部编辑和全局编辑。默认的是内部编辑。你可以通过设置 LabelAndField 组件或者FieldContainer组件的startState值。
1.返回到 MainWindow.mxml。
2.定位 accountContainer 的FieldContainer,然后添加 startState 属性为 Full Edit。确保使用了代码提示,这样能够得到正确的拼写。
<stratus:FieldContainer id="accountContainer" width="100%" height="100%" startState="Full Edit">
3.运行程序。你应当能够立刻看到所有域的输入框。(如图 45)。
图 45. 使用Full Edit 模式编辑域。
4.关闭应用。
5.在 FieldContainer 标记下,将 startState 改为 Inline Edit ,或者删除这个属性。
接下来,你将提交更改的数据到本地数据库和Force.com 云。
保存更改到管理对象
保存数据分为好几步。首先,你必须提供一个UI空间,比如一个按钮,开始保存的过程。第二,你必须将在界面中做的更改保存到客户类的一个实例中,它会在FieldContainer 中进行渲染。这个客户对象正在被显示,监视和验证,对于FieldContainer 来说它被称为管理对象。第三,你需要提交更改(保存管理对象) 到本地数据库或者同时提交到Force.com 云。
1.在VGroup 内的FieldContainer 后面,添加一个按钮,名称是Save ,还有一个 click 事件,处理函数为onAccountSaveButtonClick()。
<s:Button label="Save" click="onAccountSaveButtonClick()"/>
2.在代码块内,创建一个私有函数onAccountSaveButtonClick ,不带参数,没有返回值。
private function onAccountSaveButtonClick():void{ }
3.在 onAccountSaveButtonClick()内部,调用FieldContainer的 fieldCollection 属性的updateObject() 方法, fieldCollection 属性是FieldCollection 的一个实例。LabelAndField 和FieldContainer 组件没有属性让你访问它们管理的数据,但是它们的子组件FieldElement 和 FieldCollection 类提供了访问方法。这两个类提供了一个只读属性managedObject,指向了组件管理的数据。
private function onAccountSaveButtonClick():void{ accountContainer.fieldCollection.updateObject(); }
4.给updateObject() 方法传一个StratusResponder 类的新实例,该实例提供了一个结果处理函数onAccountUpdateResult 。当updateObject() 方法调用的时候,对应的FieldElement对象的数据域会被检查,确保每个都有有效值。如果所有的验证都通过了,而且管理对象也成功更新了,就会调用结果函数;它接受一个等于管理对象的参数,一个客户类的实例。如果验证出现了错误或者接收到了错误的FieldElement 对象,错误处理函数就会调用,这里为null。
private function onAccountSaveButtonClick():void{ accountContainer.fieldCollection.updateObject(new StratusResponder(onAccountUpdateResult,null)); }
5.在代码块内部,创建一个私有函数onAccountUpdateResult ,接收一个客户类的data参数,没有返回值。确保使用了代码提示,这样就会自动导入需要的类。
import services.stratus.Account; private function onAccountUpdateResult(data:Account):void{ }
将更改提交到数据库
接下来使用StratusWrapper 的save()方法将更改提交到本地数据库和Force.com 云。如果你是离线的,这些更改将提交到本地,当你上线的时候再提交给云。所有的这些数据管理和网络连接都由Stratus 框架自动完成。
注意: Stratus同时也有一个冲突管理服务,用来处理任何可能的冲突,同时给用户提供一个界面来选择需要提交的值。详细的冲突解决方法请看参考教程(Part 4 Building a desktop application with Flash Builder for Force.com)。
1.在 onAccountUpdateResult()内部,调用StratusWrapper实例的 save() 方法,将你希望提交的客户类的实例作为参数。
private function onAccountUpdateResult(data:Account):void{ _stratusWrapper.save(data); }
2.将第二个参数设为StratusResponder 类的实例,同时设它的结果处理函数为onAccountSaveResult ,不设置错误处理函数(null)。
_stratusWrapper.save(data, new Stratus(onAccountSaveResult,null));
3.在代码块内部,创建一个私有函数onAccountSaveResult 介绍一个SalesforceMessage 类型的参数message ,没有返回值。
private function onAccountSaveResult(message:StratusMessage):void{ }
在数据库中验证数值更改
现在使得数据更改提交给本地数据库和Force.com 云。
1.运行程序。
2.更改第一个客户的Annual Revenue,然后点击保存按钮。你应当能在左下方看到信息提示(如图 46)。在这个窗口底部是一个Stratus StatusBar 组件的实例,用来给用户提示信息。 (存在于MainWindow.mxml 文件) 。注意到即使保存了数据,更改域还是处于橙色(表面已经被更改了) 。保存数据以后,你还应当重新渲染一次FieldContainer,这样值指示器才能被消除。
图 46. Status条中的信息查看。
3.关闭程序。
4.再次运行程序。你应该能够看到这个客户的新的annual revenue值,数据已经成功更新了。
5.关闭程序。
6.回到MainWindow.mxml ,在 onAccountSaveResult() 函数内部,重新渲染FieldContainer中的数据。
private function onAccountSaveResult(message:StratusMessage):void{ accountContainer.fieldCollection.render(accountContainer.fieldCollection.managedObject); }
7.再次运行程序。
8.更改Annual Revenue 数据,然后点击保存按钮。这时候更改的域不显示为橙色。
9.关闭程序。你已经看到更改已经保存到了本地数据库,现在验证下更改是否保存到了Force.com云。
10.在浏览器中浏览 salesforce.com。
11.在Sales app中点击Account标签。
12.点击你做了更改的客户。你应该能看到你输入的新的annual revenue值 (如图47)。最后的更改域也对应于你使用Force.com Flex 桌面程序做的更改。
图 47. 在salesforce.com中查看更改的客户数据
应用程序打包和安装
完成时间:4分钟
现在,您已经建立了一个应用程序,取回/显示和编辑salesforce.com的数据。最后一步是在你的计算机上打包并安装桌面应用程序。
移除自动登录
打包前,你需要移除自动登录功能:
1.定位到SalesforceAccounts.mxml文件
2.从StratusApplication标签中移除defaultUsername, defaultPassword, 和 autoLogin属性
3.保存该文件
打包应用程序
现在你可以打包该应用程序了。
1.选择Project > Export Release Build.
2.在Export Release Build对话框中,设置Project为SalesforceAccounts,Application为SalesforceAccounts.mxml,,Export to file为SalesforceAccounts.air。(见图48)
图48打包应用程序
3.点击Next按钮。
4.在Export Release Build 对话框的Digital Signature部分,选择Export and sign an AIR file with a digital certificate(为导出的AIR标记数据签名)并且接着点击Create按钮(见图49)。
图49 标记AIR应用
你不能打包和分发没有数字签名的AIR应用程序。数字签名主要有两个目的:为你的用户提供重要保证,签名者是值得信赖的,其代码不会在他们的计算机上做任何恶意的事情,因为安装程序是打包,他们安装该应用程序不会有意外或恶意的改变。
只有几家公司可以出售AIR代码签名证书,包括ChosenSecurity, GlobalSign, Thawte, 和 Verisign;证书通常只卖给已注册的公司,在审查过程中要提交并验证公司多份文件。当你安装AIR应用程序时,具胡相关信任证书的发布者的名称会显示在安装对话框中。如果在这里你自己创建一个证书,发布者的名称显示为"Unknown."。一般情况下,你应该永远也不会安装未知发布者的应用程序(大多数人会这样)。创建你自己的证书可用于开发应用程序。此外,只要AIR被签署它仍然使用这个自己的签名证书来验证AIR包更改。更多信息请参考关于digital signing of AIR applications的AIR文档。
5.在Create Self-Signed Digital Certificate对话框中,输入你的姓名作为Publisher name,输入密码并确认该密码,然后单击Browse按钮到一个位置保存该文件并另存为YourLastName.p12(见图50)。
图50:创建数字签名
6.在Create Self-Signed Digital Certificate对话框中,点击OK
7.后退到Export Release Build对话框的Digital Signature部分,选择Remember password,清理Timestamp,点击Finish完成。
8.在你的包浏览器中定位到AIR文件(如图51)。默认情况下,它存储在项目目录中。
图51. 定位AIR文件。
注意:分发应用程序的一种简单方式是分发AIR文件。为了安装应用程序,用户必须已经安装Adobe AIR运行环境。分发应用程序更好的方式是创建一个安装包,当用户点击该包安装应用程序时,代码会执行验证AIR运行环境是否已经安装,如果没有,会安装环境,然后才是应用程序被安装。创建安装包的信息请参考该文7页教程系列和AIR documentation。
9.下载并安装Adobe AIR。在安装AIR应用程序前你必须已经安装AIR运行环境。
10.双击SalesforceAccounts.air文件进行安装。
11.在Application Install对话框中,点击Install (见图52)。请注意,Publisher标识为UNKNOWN,因为该应用程序的证书是自创建的而非购买证书也没有由公司核实。
图52安装应用程序
12.在Installation Preferences屏幕上,单击Continue。应用程序会安装到你所选择的位置。查看任务栏或dock,你会看到操作系统的应用程序默认图标山已不是ADL图标。(见图53)如何创建自定义图标请参考AIR documentation。
图53 查看应用程序图标。
13.浏览你的应用程序或Program Files目录。你应该看到你的AIR应用程序(见图54)。在Windows上,你同样也可以从桌面与开始菜单中找到该应用程序。
图54 应用程序在你电脑上的位置
14.在应用程序窗口中,输入你的salesforce.com用户名和密码(如果需要在密码后附加安全令牌),然后点击Login按钮。你应该能看到salesforce.com的数据。
15.关闭该应用程序。
恭喜你!你现在已经成功地创建了第一个Force.com Flex 桌面应用程序,该AIR可以取回/显示/编辑salesforce.com数据。
推荐下载: Flex 3 Builder