强调了模版条件(Underscore Conditionals in Template)

2019-10-17 13:58发布

这里是我的模板:

var tmpl = _.template('<<%= elementTag %> <% if (_.has(elementClass)) { %> class="<%= elementClass %>" <% } %> <%= elementExtra %>><%= template(elementContent) %></<%= elementTag %>>');

有的,我将使用这个模板我没有一个对象的elementClass属性设置。 我试着使用_.has这样模版只试图打印的地方对象属性elementClass的定义,但我没有成功。 只有控制台错误状态elementClass未设置,大概是因为条件语句未能奏效,因为我本来打算。

我知道这是一个简单的问题,但我似乎无法来解决这个问题 - 我该如何使用条件在这样的语句来检测对象,而某些属性进行设置?

Answer 1:

你不能在一般情况下,使用_.isDefined这一点。 考虑此模板:

<script id="t" type="text/x-underscore-template">
    <% if(!_.isUndefined(elementClass)) { %>
        <%= elementClass %>
    <% } else { %>
        No such thing.
    <% } %>
</script>

与此代码:

var t = _.template($('#t').html());
console.log(t({ }));

要将呼叫t应该给你的ReferenceError因为没有elementClass范围为编译模板函数。 所以,如果你的对象不具有elementClass的所有财产,然后在模板功能,当你试图让你的模板失败。

演示: http://jsfiddle.net/ambiguous/H22D2/

问题是, _.isUndefined功能只能检查一个表达式的 ,它无法检查(因为模板的内部或属性变量with使用)你传递给它已被宣布。

如果对象将有elementClass属性,但它可能有一个未定义的值,那么你可以使用_.isDefined和这样的:

t({ elementClass: undefined })

将被罚款。

演示: http://jsfiddle.net/ambiguous/LUakg/

如果对象可能会或可能不会有elementClass的属性,那么你坚持使用typeof作为typeof并不试图评估其操作数。 事情是这样的:

<script id="t" type="text/x-underscore-template">
    <% if(typeof elementClass !== 'undefined') { %>
        <%= elementClass %>
    <% } else { %>
        No such thing.
    <% } %>
</script>

将在这三种情况下感兴趣的正常工作:

var t = _.template($('#t').html());
console.log(t({ }));
console.log(t({ elementClass: undefined }));
console.log(t({ elementClass: 'pancakes' }));

演示: http://jsfiddle.net/ambiguous/H5xC7/



Answer 2:

您可以检查elementClass是不是undefined 。 (使用_.isUndefined ,因为我以前认为会的工作,不。)

var tmpl = _.template('<<%= elementTag %> <% if ( typeof elementClass !== "undefined" ) ) { print("class=\'elementClass\'") } %> <%= elementExtra %>><%= template(elementContent) %></<%= elementTag %>>');


文章来源: Underscore Conditionals in Template