想象一下,在webapp的标题内显示用户的jsrender名称和姓氏。我传递给模板的对象是" User"宾语。然后在模板中,我显示{{name}}和{{surname}}。但是如果" User"对象是null还是未定?我只能检查名称或姓氏是否为空(或空)。
检查空值的正确方法是什么? 例如,一个对象' Order'与另一个嵌套对象' Shipping'与' id'和' name'属性。 Shippinig对象存在且不为null,但其属性为null。
如果我使用' {{如果shipping.id}}'在模板中我总是得到这个错误: {错误:TypeError:无法读取属性' id'无效} 即使不是
,似乎运费也是空的当返回的对象为空时(例如,当搜索没有返回结果时),并且我想显示模板而不是另一个
时,这也应该是有用的由于
答案 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