JsRender - 检查嵌套值是否为null

时间:2014-12-23 16:06:23

标签: jsrender

想象一下,在webapp的标题内显示用户的jsrender名称和姓氏。我传递给模板的对象是" User"宾语。然后在模板中,我显示{{name}}和{{surname}}。但是如果" User"对象是null还是未定?我只能检查名称或姓氏是否为空(或空)。

检查空值的正确方法是什么? 例如,一个对象' Order'与另一个嵌套对象' Shipping'与' id'和' name'属性。 Shippinig对象存在且不为null,但其属性为null。

如果我使用' {{如果shipping.id}}'在模板中我总是得到这个错误: {错误:TypeError:无法读取属性' id'无效} 即使不是

,似乎运费也是空的

当返回的对象为空时(例如,当搜索没有返回结果时),并且我想显示模板而不是另一个

时,这也应该是有用的

由于

1 个答案:

答案 0 :(得分:9)

假设你有:

var html = myTemplate.render(myOrder);

,您的模板是:

{{:shipping.id}}

以下是myOrder的不同版本的结果:

  • myOrder = {shipping: {name: "Jo", id: "J1"} }

    - > html:"J1

  • myOrder = {shipping: {name: "Jo"} }

    - > html:""

  • myOrder = {}

    - > html:"{Error: TypeError: Unable to get property 'id' of undefined or null reference}"

现在,有几种方法可以处理最后一种情况 - 不输出错误消息:

1) 使用onerror=...标记上的{{:}}指定错误情况下代码的后备呈现。

例如,如果要在装运对象为空或未定义时呈现空字符串,则可以使用模板:

{{:shipping.id onerror=''}}

或者你可以写

{{:shipping.id onerror='no shipping info'}}

2) 使用{{if}}{{if}} {{else}} {{/if}}

测试送货对象
{{if shipping}}{{:shipping.id}}{{else}}no shipping info{{/if}}

3) 使用{{for}}{{for}} {{else}} {{/for}}

{{for shipping}}{{:id}}{{else}}no shipping info{{/for}}

4) 使用空检查

{{:shipping && shipping.id}}

5) 使用三元表达式

{{:shipping ? shipping.id : 'no shipping info'}}

总而言之,这是一个显示所有这些替代方案的模板:

模板

<script id="myTmpl" type="text/x-jsrender">
    1 {{:shipping.id onerror='no shipping info'}}<br/>
    2 {{if shipping}}{{:shipping.id}}{{else}}no shipping info{{/if}}<br />
    3 {{for shipping}}{{:id}}{{else}}no shipping info{{/for}}<br />
    4 {{:shipping && shipping.id}}<br />
    5 {{:shipping ? shipping.id : 'no shipping info'}}<br />
</script>

脚本

var myOrder = {};
var html = myTemplate.render(myOrder);

输出:

  

1没有送货信息
2没有送货信息
3没有   送货信息
4 4没有送货信息

最后,如果订单本身为null或未定义,或者您传递了一个订单数组,但某些订单可能未定义,那么您可以用{{if #data}}或等效的{{1}包裹整个模板。 },用于测试当前对象(您呈现此模板的上下文数据对象)是否为空。

模板

{{if}}

脚本

<script id="myTmpl" type="text/x-jsrender">
    {{if}}
        {{:shipping.id onerror='no shipping info'}}<br/>
    {{else}}
        no order<br/>
    {{/if}}
</script>

输出:

  

J1
无订单
无运输信息
J2