jQuery模板:jQuery Templates Proposal(5)

http://www.itjxue.com  2015-08-06 23:07  来源:未知  点击次数: 

模板渲染和呈现回调

你可以利用传递给render()函数或append()的options参数来指定模板回调函数。有两个回调函数:

  • rendering:该函数在模板渲染时立即调用。它作为模板自身内同一$context对象的参数。回调返回flase以防渲染数据项。
  • rendered:该函数在模板渲染时立即调用,但是在DOM元素已添加到文档之前。 它同样作为模板自身内同一$context对象的参数。

以下几节讨论使用rendering和rendered函数的几种情况:

执行复杂的计算

想象以下你要计算在模板中显示的每个product的税率,但你又不想计算税率的逻辑出现在模板自身中。此时,你可以像这样在rendering函数中执行税率计算:

<script type="text/javascript">
    jQuery(function() {
        var products = [
          { name: "Product 1", price: 12.99 },
          { name: "Product 2", price: 9.99 },
          { name: "Product 3", price: 35.59 }
        ];
        $("ul").append("#template", products, { rendering: rendering });
       function rendering(context) {
            var item = context.dataItem;
            // setup additional information to be used more clearly within the template
            // (avoids complex expressions)
            item.tax = Math.floor(item.price * 8.75) / 100;
        }
    });
</script>
<script id="template" type="text/html">
 <li>{%= name %} - price with tax {%= price + tax %} </li>
</script>
<ul></ul>

取消模板渲染

你可以利用rendering()回调取消特定模板实例的渲染。下面的代码演示了如何仅渲染标了删除标记的产品。

<script type="text/javascript">
   jQuery(function() {
        var products = [
            { name: "Product 1", price: 12.99 },
            { name: "Product 2", price: 9.99, deleted: true },
            { name: "Product 3", price: 35.59 }
        ];
        $("ul").append("#template", products, { rendering: rendering });
        function rendering(context) {
            if (context.dataItem.deleted) {
                return false;
            }
        }
    });
</script>
<script id="template" type="text/html">
 <li>{%= name %} - {%= price %}</li>
</script>
<ul></ul>

当rendering()返回false时,模板不会显示。在上面的示例代码中,当产品标上删除标记时,模板不会渲染。

嵌套模板

利用回调函数,你可以创建其嵌套模板。例如,下面代码显示了如何显示联系人名单,每个联系人有一个或多个电话号码。contactTemplate 用来显示联系人名单,phoneTemplate 用来显示每个电话号码。

<script type="text/javascript">
    $(function() {   
        var contacts = [
            { name: "Dave Reed", phones: ["209-989-8888", "209-800-9090"] },
            { name: "Stephen Walther", phones: ["206-999-8888"] },
            { name: "Boris Moore", phones: ["415-999-2545"] }
        ];
        $("div").append("#contactTemplate", contacts, {rendered:rendered});
    });
    function rendered(context, dom) {
        $("div.phones", dom)
            .append("#phoneTemplate", context.dataItem.phones);
    } 
</script>
<script id="contactTemplate" type="text/html">
 <div>
     {%= name %}
     <div class="phones"></div>
 </div>
</script>
<script id="phoneTemplate" type="text/html">
 <div>
     Phone: {%= $context.dataItem %}
 </div>
</script>
<div></div>

创建插件

假设你想在模板中使用插件--如jQuery UI Datepicker。此外,想象以下,你希望插件显示数据项的值。例如,你希望DatePicker 默认显示数据项的一个date属性。在这种情况下,你需要利用rendered()回调创建插件并用数据项的值初始化插件。

例如,下面的代码显示联系人的名单,rendered() 用来创建一个jQuery UI Datepicker插件,并在模板中的一个input元素中附加插件。DataPicker 的默认值为联系人的生日。

<script type="text/javascript">
    $(function() {
        var contacts = [
            { name: "Dave Reed", birthdate: new Date("12/25/1980") },
            { name: "Stephen Walther", birthdate: new Date("12/25/1977") },
            { name: "Boris Moore", birthdate: new Date("12/25/1934") },
            { name: "Eilon Lipton", birthdate: new Date("12/25/2004") },
            { name: "Assad Safiullah", birthdate: new Date("12/25/1954") }
        ];
        $("div").append("#template", contacts, { rendered: rendered });
    });
    function rendered(context, dom) {
        $("input", dom)
            .datepicker({ defaultDate: context.dataItem.birthdate })
    }    
</script>
<script id="template" type="text/html">
 <div>
     {%= name %}
     <br />
     birthdate: <input />
 </div>
</script>
 
<div></div>

无表达式模板

如果你不想任何诸如{%=....%}的表达式出现在模板中,你可以在模板实例中使用rendered函数动态的为一个元素赋值。例如,下面模板显示产品清单。注意,模板只包含HTML标记,没有表达式。

讨论(Discussion)

这些都是在论坛讨论中提出的问题。

HTML编码

在目前的提案中,数据项默认是不被编码的。这意味着,除非你采取额外的行为,用模板显示用户提交的数据的文档将为跨站点脚本(XSS)攻击大开门户。在早期的提案中,我们讨论为HTML编码内容创建一个诸如{!productName }特别分隔符。在目前的提案中,我们建议使用text()模板函数,而不是用{%= text(productName) %} 。

脚本与样式模板容器

在目前的提案中,我们建议在<script id="template" type="text/html"></script>元素中包裹模板。有人提议,较好的选择是用<style id="template" type="text/html"></style>元素,因为样式更好的体现了模板表象的性质。

样式元素的缺点在于不允许出现在文档的body中,如果你不能修改head元素的内容--例如,你正在使用内容管理系统(CMS)工作,你就无法创建模板。

从技术上讲,当前的提案与用SCRIPT或STYLE包裹模板是兼容的。如果你愿意,你可以使用Style元素并替换type属性。

模板应是真正的DOM元素

只有几个人建议模板应代表真正的DOM元素,这也与ASP . NET Ajax 库创建模板的方法相似。换句话说,给模板使用标准的DOM元素,用display:none隐藏模板。

使用真正的DOM元素模板的主要缺点在于使用真正的DOM元素会导致不良副作用。例如,考虑下面的代码:

<div id="template" style="display:none">
  <img src="{%= imageUrl %}" />
  <br /> {% imageTitle %}
</div>

在这种情况下,浏览器会尝试加载位于{%= imageUrl } 地址的图片,这并不是你向发生的。像这样的例子有很多,一个表达式会导致意想不到的副作用或无效的 HTML。例如,如果是在form中,模板中的input可能post一个实际的值。另一个很好的例子是在<div id="{ = foo %}"/>其中的id属性包含无效的值。 

 

(责任编辑:IT教学网)

更多

推荐Javascript/Ajax文章