Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 下划线模板中的布尔检查_Javascript_Templates_Underscore.js_Boolean Logic_Underscore.js Templating - Fatal编程技术网

Javascript 下划线模板中的布尔检查

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代

为了与asp.net webforms兼容,我不得不替换默认的下划线分隔符/内插正则表达式

_.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)
    查看它)。我会把它修好的。是的,所有这些牙套都有点太多了。