Javascript 下划线模板中的布尔检查
为了与asp.net webforms兼容,我不得不替换默认的下划线分隔符/内插正则表达式Javascript 下划线模板中的布尔检查,javascript,templates,underscore.js,boolean-logic,underscore.js-templating,Javascript,Templates,Underscore.js,Boolean Logic,Underscore.js Templating,为了与asp.net webforms兼容,我不得不替换默认的下划线分隔符/内插正则表达式 _.templateSettings = { interpolate : /\{\{(.+?)\}\}/g }; 试过这个 \.template({{if(loggedIn)Welcome{{{name}}}},{name:“James”,完成:true}) 但这似乎不是使用模板系统检查布尔表达式的方法(因为发生了错误)。但从文件上看,这似乎是可能的 以及使用 那么,如何使用上述插值执行任意js代
_.templateSettings = {
interpolate : /\{\{(.+?)\}\}/g
};
试过这个
\.template({{if(loggedIn)Welcome{{{name}}}},{name:“James”,完成:true})代码>
但这似乎不是使用模板系统检查布尔表达式的方法(因为发生了错误)。但从文件上看,这似乎是可能的
以及使用
- 那么,如何使用上述插值执行任意js代码呢
只要您没有覆盖设置,您仍然可以使用:
来评估代码
我也看到过尝试定义下划线.templateSettings.evaluate
设置以匹配Mustache语法,但Mustache对模板求值的抵抗力非常强,因此这将是一件困难的事情。您的问题是,您正在为
定义一个胡须样式替换,但尝试在正常情况下使用它使用
。从:
定义一个interpolateregex来匹配应该逐字插入的表达式,escaperegex来匹配应该在HTML转义后插入的表达式,evaluateregex来匹配应该在不插入结果字符串的情况下进行计算的表达式
因此有三个正则表达式在起作用:
插值用于
转义用于
评估用于
您告诉下划线使用{{{…}}
代替
然后您会收到错误,因为无法插值if(loggedIn)
。您只需修复。.templateSettings
即可反映您正在尝试执行的操作:
_.templateSettings = {
evaluate: /\{\{(.+?)\}\}/g,
interpolate: /\{\{=(.+?)\}\}/g
};
然后您的模板将如下所示:
{{ if(loggedIn) { }}Welcome {{= name }} {{ } }}
演示:
您需要在模板中包含{
和}
,因为\u0.template
在编译模板时会添加分号,这会导致以下情况:
if(loggedIn) {; ...
(感谢您指出这一点)
您可能还需要添加一个escape正则表达式,它可能是/\{-(.+?)\}\}/g
我相信这对于向胡须样式语法的转换是有效的:
/**
* @configuration transform Underscore.js template syntax
* @description change the Ruby on Rails style syntax to the Mustache syntax
* @default <%= var %>
* @modified
* evaluate {{ JavaScript code}} execute arbitrary js code, such as loops
* interpolate {{= variable }} prints value of variables
* escape {{- variable }} this syntax will html escape variables
*/
_.templateSettings = {
evaluate: /\{\{(.+?)\}\}/g,
interpolate: /\{\{=(.+?)\}\}/g,
escape: /\{\{-(.+?)\}\}/g
};
/**
*@configuration transform下划线.js模板语法
*@description将Ruby-on-Rails样式的语法更改为Mustache语法
*@默认值
*@修改
*计算{JavaScript代码}}执行任意js代码,例如循环
*插值{{=variable}}打印变量的值
*escape{{-variable}}此语法将使用html转义变量
*/
_.templateSettings={
评估:/\{(.+?)\}\}/g,
插值:/\{=(.+?)\}\}/g,
转义:/\{-(.+?)\}}/g
};
这将是mustache风格的语法,但保留了使用“=”和“-”的原始选项。不使用这两种方法计算JS,例如for循环。你可以交换它们,{{var}}是插值,求值可以是其他的,如果你愿意,可以保持模板更干净,因为插值最常用。hmm所以我最好使用一个专用的模板库:)如果你真的想要胡子,毫无疑问,您需要使用专用的模板库。但请记住,这个线程的起源是您需要在模板中“执行任意js代码”,而Mustach不会这样:)。。虽然Mustache对简单的布尔块非常友好。是的,我不会劫持帖子。我将寻找解决方案,直到得到答案!!令人惊讶的是,这也不起作用。嗯,似乎我在这里做错了什么。.template(“,{name:“James”,completed:true})
我已经找到了它的工作原理,您必须执行下面的\模板(“欢迎”{name:“James”,completed:false})代码>这可能是我所能找到的下划线模板设置的最好解释。他们网站的解释还有很多需要改进的地方……只要注意一下你的小提琴就会显示出Welcome James
,不管loggedIn
是true
还是false
在{{if(loggedIn){}}欢迎{{name}}}{code>之前和之后添加大括号就可以修复它。不过可读性不是很好。@JaredCater:看来你是对的,。模板正在滑动一个编译后的版本中显示if(loggedIn)
(您可以console.log({.template($('{tmpl').html()).source)
查看它)。我会把它修好的。是的,所有这些牙套都有点太多了。