ExtJs学习笔记(21)-使用XTemplate结合WCF显示数据

个人认为,XTemplate是ExtJs中最灵活的用来显示数据的组件,有点类似aspx中的Repeater控件,显示数据的模板完全可以由用户以html方式来定制.

先给一个官方的静态示例(稍微改了下),代码并不复杂,关键的地方,我已经注释了

 <script type="text/javascript">
       Ext.onReady(function() {
            var data = {
               name: 'Jack Slocum',
               title: 'Lead Developer',
               company: 'Ext JS, LLC',
               email: 'jack@extjs.com',
               address: '4 Red Bulls Drive',
               city: 'Cleveland',
               state: 'Ohio',
               zip: '44102',
               drinks: ['Red Bull', 'Coffee', 'Water'],
               kids: [
   { name: 'Sara Grace', age: 3 },
   { name: 'Zachary', age: 2 },
   { name: 'John James', age: 0 }
]
           };
           var tpl = new Ext.XTemplate(
'<p>Name: {name}</p>',
'<p>Title: {title}</p>',
'<p>Company: {company}</p>',
'<p>[Kids:] ',
'<tpl for="kids">',//表明这里循环读取kids节的数据
'<p>  {name}</p>',
'</tpl></p>',
'<p>[Drinks:] ',
'<tpl for="drinks">',
'<p>  {#}.{.}</p>', //表明这里循环读取drinks节的数据,当数据没有属性名称时,用"."代表数据
'</tpl></p>'
);
           tpl.overwrite(Ext.getBody(), data);
        });
   </script>

运行结果图:

接下来我们看看如何跟服务器端的WCF做交互

1.首先定义一个用于信息传输的实体类(实际开发中,可以是任何可序列化的class,包括linq to sql生成的类)

Code
using System.Collections.Generic;
using System.Runtime.Serialization;


namespace Ajax_WCF
{
    [DataContract]
    public class Person
    {
        [DataMember]
        public string name { set; get; }
        [DataMember]
        public string title { set; get; }
        [DataMember]
        public string company { set; get; }
        [DataMember]
        public string email { set; get; }
        [DataMember]
        public string address { set; get; }
        [DataMember]
        public string city { set; get; }
        [DataMember]
        public string state { set; get; }
        [DataMember]
        public string zip { set; get; }
        [DataMember]
        public List<AbstractData> drinks { set; get; }
        [DataMember]
        public List<KidData> kids { set; get; }
    }


    [DataContract]
    public class AbstractData
    {
        [DataMember]
        public string name { set; get; }
    }


    [DataContract]
    public class KidData : AbstractData
    {
        [DataMember]
        public int age { set; get; }
    }
}

2.新建一个"启用了Ajax的WCF服务" a.同时将svc手动修改一下,注意下面的高亮部分要手动加上去:

<%@ ServiceHost Language="C#" Debug="true" Service="Ajax_WCF.MyService" CodeBehind="MyService.svc.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory"%> b.web.config中,也参考下面修改  <behavior name="Ajax_WCF.MyServiceAspNetAjaxBehavior"> <webHttp /> <!--<enableWebScript/>-->     </behavior>

c.在wcf中增加一个方法,代码如下:

Code
[OperationContract]
        [WebInvoke(ResponseFormat = WebMessageFormat.Json, UriTemplate = "GetPerson", Method = "*")]
        public Person GetPerson() {
            System.Threading.Thread.Sleep(3000);//为演示loading效果,停3秒
            return new Person() {
                name = "Jack Slocum",
                title = "Lead Developer",
                company = "Ext JS, LLC",
                email = "jack@extjs.com",
                address = "4 Red Bulls Drive",
                city = "Cleveland",
                state = "Ohio",
                zip = "44102",
                drinks = new List<AbstractData> { 
                new AbstractData(){name="Red Bull"},
                new AbstractData(){name="Coffee"},
                new AbstractData(){name="Water"}
                },
                kids = new List<KidData> { 
                new KidData(){name="Red Bull",age=3},
                new KidData(){name="Coffee",age=2},
                new KidData(){name="Water",age=0}
                }
            };
        }

这里为了简单起见,直接new并初始化了一个Person对象,然后返回为JSON格式

3.最后修改一下前面静态页的代码,完整页面代码如下:

Code
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
    <title>XTemplate示例</title>
    <link rel="stylesheet" type="text/css" href="js/ext2.2/resources/css/ext-all.css"/> 
    <script type="text/javascript" src="js/ext2.2/adapter/ext/ext-base.js"></script> 
    <script type="text/javascript" src="js/ext2.2/ext-all.js"></script> 
    <style type="text/css">
        body{font-size:9pt;padding:20px;}
        .red{color:red;}
        h1{padding-bottom:10px;}
    </style>
</head>
<body>
<script type="text/javascript">
    Ext.onReady(function() {        

        var tpl = new Ext.XTemplate(
        '<p>Name: {name}</p>',
        '<p>Title: {title}</p>',
        '<p>Company: {company}</p>',
        '<p>[Kids:] ',
        '<tpl for="kids">',
        '<p>  {name}</p>',
        '</tpl></p>',
        '<p>[Drinks:] ',
        '<tpl for="drinks">',
        '<p>  {#}.{name}</p>', 
        '</tpl></p>'
        );

        var demo = Ext.get("demo");
        demo.dom.innerHTML = "数据加载中,请稍候";
        demo.dom.className = "red";

        Ext.Ajax.request({
            url: "MyService.svc/GetPerson",
            method: "GET",
            success: function(request) {
                demo.dom.className = "";
                var data = Ext.util.JSON.decode(request.responseText);
                tpl.overwrite("demo", data);
            },
            failure: function() {
                alert("failure!");
            }
        });       

    });
    </script>   
    <h1>XTemplate 示例</h1>
    <div id="demo" style="border:1px solid #ccc;padding:10px;width:300px"></div>
</body>


</html>

解释一下:利用ExtJs的Ajax对象,请求MyServices.svc/GetPerson方法,获取Json字符串,其它地方完全一样,需要注意的是:

a.返回的字符串,需要用Ext.Util.JSON.decode转换成JSON对象

b.为了显示出loading加载效果,在调用Ajax的Request之前,用demo.com.innerHTML和demo.com.className先把目标div设置成"加载中"的字样 运行效果如下:

转载请注明来自"菩提树下的杨过"

这回运行时,增加了"数据加载中"的效果,加载成功后与刚才的静态示例显示结果完全相同

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小鄧子的技术博客专栏

【译】自定义RequestHandler

不得不再次声明,我们不对如何创建Picasso实例做详细讲解,但是,我们希望你能理解如下代码片段:

7310
来自专栏肖蕾的博客

第一章:Hello Libgdx

https://gitee.com/xcode_xiao/LibGdxDemos2/tree/master/HelloGDX

10610
来自专栏青青天空树

趣味题:恺撒Caesar密码(c++实现)

描述:Julius Caesar 生活在充满危险和阴谋的年代。为了生存,他首次发明了密码,用于军队的消息传递。假设你是Caesar 军团中的一名军官,需要把Ca...

8720
来自专栏雪胖纸的玩蛇日常

Uncaught SyntaxError: Unexpected token ' in JSON at position 1

1.4K30
来自专栏葡萄城控件技术团队

扩展GridView控件——为内容项添加拖放及分组功能

引言 相信大家对GridView都不陌生,是非常有用的控件,用于平铺有序的显示多个内容项。打开任何WinRT应用或者是微软合作商的网站,都会在APP中发现Gri...

37150
来自专栏JadePeng的技术博客

Docker+Jenkins持续集成环境(5): android构建与apk发布

项目组除了常规的java项目,还有不少android项目,如何使用jenkins来实现自动构建呢?本文会介绍安卓项目通过jenkins构建的方法,并设计开发一个...

53480
来自专栏专注研发

推荐几种Java任务调度的实现

原文:http://www.ibm.com/developerworks/cn/java/j-lo-taskschedule/

23420
来自专栏Python小屋

Python回文判断代码优化与6个思考题

送个福利:清华大学出版社和新宝图书专营店联合推出正版特价图书《Python程序设计开发宝典》,原价69元,特价47.6元,详情:https://detail.t...

37660
来自专栏向治洪

Picasso 图片加载库

Picasso 英文意思国外一个很有名的画家毕加索的名字,国外项目取名还是很有意思的! 从github新下载的picasso项目有依赖其他第三方开源项目okht...

20270
来自专栏Golang语言社区

用Go实现一门解释型语言

A interpreter language implementation in Go

9920

扫码关注云+社区

领取腾讯云代金券