首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

REST Service 的最佳实践,第 2 部分 REST service 化一个数据系统-5

REST Service 的最佳实践,第 2 部分 REST service 化一个数据系统-5

有几种方式来定义 widget,清单 3 给出了其中的一种,用来展示一定类型的数据:图书标题,图书作者,图书标号,图书最新最低价格等等。这种方式编写的 viewer 具有一定的普适性和可重用性,只要数据服务提供了这些信息都可以用这个 viewer 来展示。清单 4 给出了另一种 widget 的定义方式。
清单 4. 图书搜索服务 viewer 的 widget 定义文件 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<iw:iwidget name="amazonSearchViewer" xmlns:iw="http://www.ibm.com/xmlns/prod/iWidget"
iScope="common.iwidget.amazonSearchViewer" allowInstanceContent="true"
supportedModes="view edit" mode="view" lang="en">

<iw:itemSet id="attributes" >
<iw:item id="feedURL" value="" readOnly="false"/>
<iw:itemDescription name="feedURL" type="url.feed.tabular"
description="Customized widget for displaying book list from Amazon"/>

<iw:item id="title" value="" readOnly="false"/>
<iw:item id="view" value="table" readOnly="false"/>

</iw:itemSet>

<iw:resource uri="../styles/common.css" />
<iw:resource uri="amazonSearchViewer.js" />
<iw:content mode="view">
<![CDATA[
<div id="_IWID_serviceNode">
<div id="_IWID_loadingNode"
style="display:none;margin-left:48%;margin-top:40px;height:80px;">
</div>
</div>
]]>
</iw:content>
<iw:content mode="edit">
<![CDATA[
    ]]>
</iw:content>
</iw:iwidget>




清单 4 的 itemSet 只描述了数据源的 FeedURL,而没有更多的关于可配置数据项的描述,这种方式定义的 widget 把对数据的处理隐含在代码里面,局限性比较大,可配置性差,可重用性也差。下面需要写一些 javascript 来处理一个展示的逻辑,如清单 5 所示。负责创建页面元素,并发送 HTTP 请求取回来 feed 的结果。
清单 5. widget 的逻辑代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
dojo.provide("common.iwidget.amazonSearchViewer");

dojo.declare("common.iwidget.amazonSearchViewer", null, {

title:null,
serviceURL:null,
view:null,

onLoad: function(){
this.domID = "_" + this.iContext.widgetId + "_";
var att = this.iContext.getiWidgetAttributes();
   this.title = att.getItemValue("title");
   this.serviceURL = att.getItemValue("feedURL");
   this.view = att.getItemValue("view");
   
   var loading = dojo.byId(this.domID + "loadingNode");
   var innerNode = document.createElement("div");
   loading.appendChild(innerNode);
   new hyperservice.iwidget.ui.Loading({},innerNode);
},

onView: function(){
   var serviceNode = dojo.byId(this.domID + "serviceNode");
   var innerNode = document.createElement("div")
   serviceNode.appendChild(innerNode)
   
      //fetch the feed,
   var self = this;
   var loadCallbackFunc = function(feed){
   new iwidget.ui.FeedListViewer
   ({feed:feed,viewTitle:feed.title,serviceInstance:self.serviceURL,
   selectedItemViewer:"common.ui.AmazonSearchListViewerItem"},innerNode);
   }
   
   var errorCallbackFunc = function(data){
   console.error("failed to fetch a feed with url:"+self.serviceURL);
   console.error(data)
   }
   feedFetcher.fetch(this.serviceURL, loadCallbackFunc,errorCallbackFunc);
   }
   }
});

返回列表