ExtJs4 筆記(4) Ext.XTemplate 模板




本篇將涉及到ExtJs中一個重要的概念,模板。話說Razor很神奇,但是我個人不是很喜歡那種html混編C#的方式,彷彿又回到了asp的時代。ExtJs的模板同樣也可以組織生成靈活的html,而且代碼和html有效的分離。本文將細細分析ExtJs模板的用法。

行文之前我先把公共的html和用到的js數據貼在前面,後面的代碼都要引用到。

[html]
    <h1>使用標籤tpl和操作符for</h1>
        <div class="content" id="div1"></div>
    <h1>在子模板的範圍內訪問父元素對象</h1>
        <div class="content" id="div2"></div>
    <h1>數組元素索引和簡單運算支持</h1>
        <div class="content" id="div3"></div>
    <h1>自動渲染單根數組</h1>
        <div class="content" id="div4"></div>
    <h1>條件邏輯判斷</h1>
        <div class="content" id="div5"></div>
    <h1>即時執行任意的代碼</h1>
        <div class="content" id="div6"></div>
    <h1>模板成員函數</h1>
        <div class="content" id="div7"></div>

定義data數據源:

[Js]
    var data = {
        name: '張三',
        job: 'C#程序員',
        company: '惠普',
        email: '[email protected]',
        address: '武漢市洪山區光谷軟件園',
        city: '武漢',
        state: '正常',
        zip: '430000',
        drinks: ['綠茶', '紅酒', '咖啡'],
        friends: [{
            name: '李四',
            age: 6,
            like: '鮮花'
        }, {
            name: '王五',
            age: 26,
            like: '足球'
        }, {
            name: '趙六',
            age: 81,
            like: '遊戲'
        }]
    };

一、使用標籤tpl和操作符for

現在我要把data數據源展示到頁面上,並組織到table裏面。但是這個html不是寫死的,而是通過模板生成。配合使用標籤tpl和操作符for,可以循環輸出張三的朋友:

[Js]
    //使用標籤tpl和操作符for
    var tpl = new Ext.XTemplate(
          '<table cellpadding=0 cellspacing=0 border=1 width=400px>',
          '<tr><td colspan=2 align=center><b>{name}的個人資料</b></td></tr>',
          '<tr><td>姓名:</td><td>{name}</td></tr>',
          '<tr><td>工作:</td><td>{job}</td></tr>',
          '<tr><td>公司:</td><td>{company}</td></tr>',
          '<tr><td>地址:</td><td>{address}</td></tr>',
          '<tr><td>喜好飲品:</td><td>{drinks}</td></tr>',
          '<tr><td>他的好友:</td><td>',
          '<tpl for="friends">',
          '<p>{name}:{age}歲</p>',
          '</tpl></td></tr>',
          '</table>'
    );
    tpl.overwrite(Ext.get("div1"), data);

查看輸出效果:

二、在子模板的範圍內訪問父元素對象

當我們在遍歷輸出張三的朋友時,需要再次訪問張三的信息,怎麼做呢,看如下js:

[Js]
    //在子模板的範圍內訪問父元素對象
    var tp2 = new Ext.XTemplate(
     '<tpl for="friends">',
     '<p>{name}是{parent.name}的好友。</p>',
      '</tpl>'
    );
    tp2.overwrite(Ext.get("div2"), data);

查看輸出效果:

三、數組元素索引和簡單運算支持

在循環訪問數組時,可以通過{#}獲取索引信息,基礎數據還可以支持簡單運算:

[Js]
    //數組元素索引和簡單運算支持
    var tp3 = new Ext.XTemplate(
     '<tpl for="friends">',
         '<p>{#}、一年後,{name}的年齡是:{age+1}</p>',
      '</tpl>'
    );
    tp3.overwrite(Ext.get("div3"), data);

查看輸出效果:

四、自動渲染單根數組

通過{.}可以自動渲染沒有鍵值對的單根數組,示例如下:

[Js]
    //自動渲染單根數組
    var tp4 = new Ext.XTemplate(
     '喜好飲品:<tpl for="drinks">',
     ' {.}',
      '</tpl>'
    );
    tp4.overwrite(Ext.get("div4"), data);

查看輸出效果:

五、條件邏輯判斷

配合標籤tpl和操作符if的使用,可以做一些簡單的邏輯判斷,注意沒有else操作符,你可以寫兩個if來代替。另外大於,小於符號要經過html編碼,不能直接寫出。

[Js]
    //條件邏輯判斷
    var tp5 = new Ext.XTemplate(
     '<table cellpadding=0 cellspacing=0 border=1 width=400px>',
     '<tr><td>他的好友:</td><td>',
     '<tpl for="friends">',
         '<tpl if="age < 18"><p>{name}:[未成年]</p></tpl>',
         '<tpl if="age >= 18"><p>{name}:{age}歲</p></tpl>',
     '</tpl></td></tr>',
     '</table>'
    );
    tp5.overwrite("div5", data);

查看輸出效果:

六、即時執行任意的代碼

在XTemplate中,{[ ... ]}範圍內的內容會在模板作用域的範圍下執行。這裏有一些特殊的變量:
values:當前作用域下的值。若想改變其中的值,你可以切換子模板的作用域。
parent:父級模板的對象
xindex:若是循環模板,這是當前循環的索引index(從1開始)。
xcount:若是循環模板,這是循環的次數 。

[Js]
    //即時執行任意的代碼
    var tp6 = new Ext.XTemplate(
     '當前日期:{[new Date().toLocaleDateString()]}',
     '<table cellpadding=0 cellspacing=0 border=1 width=400px>',
     '<tpl for="friends"><tr>',
         '<tpl if="xindex == 1"><td rowspan={[xcount]}>他的好友:</td></tpl>',
         '<td>{["姓名:" + values.name + ",年齡:" + values.age + ","+ (values.like=="鮮花"?"是個女孩":"是個男孩")]}</td>',
     '</tr></tpl>',
     '</table>'
    );
    tp6.overwrite("div6", data);

查看輸出效果:

七、模板成員函數

在模板中還可以調用自定義函數,這些函數通過配置傳入。相關寫法如下:

[Js]
    //模板成員函數
    var tp7 = new Ext.XTemplate(
     '<b>他的好友:</b><tpl for="friends"><p>',
         '<tpl if="this.isWoman(like)">{name}:是個女性。</tpl>',
         '<tpl if="this.isMen(like)">{name}:是個男性。</tpl>',
         '<tpl if="this.isChild(age)">{name}:是個小孩。</tpl>',
     '</p></tpl>', {
         isWoman: function (like) {
             return like == '鮮花';
         },
         isMen: function (like) {
             return like != "鮮花";
         },
         isChild: function (age) {
             return age < 18;
         }
     }
    );
    tp7.overwrite(Ext.get("div7"), data);

查看輸出效果:

發佈了18 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章