Laravel 如何更改handlebar.js的默认分隔符?

Laravel 如何更改handlebar.js的默认分隔符?,laravel,handlebars.js,Laravel,Handlebars.js,我需要使用handlebar.js,还需要使用Laravel(PHP框架)的刀片模板引擎。标签{{}与blade的占位符完全相同 如何将这些{{var}}更改为类似的内容?对于“标准”把手,这是不可能的 我做了这个函数。 var Handlebars = require('handlebars'); var useDelims = require('handlebars-delimiters'); var a = Handlebars.compile('{{ name }}<%= nam

我需要使用handlebar.js,还需要使用Laravel(PHP框架)的刀片模板引擎。标签{{}与blade的占位符完全相同

如何将这些{{var}}更改为类似的内容?

对于“标准”把手,这是不可能的

我做了这个函数。
var Handlebars = require('handlebars');
var useDelims = require('handlebars-delimiters');

var a = Handlebars.compile('{{ name }}<%= name %>')({name: 'Jon'});
console.log(a);
//=> 'Jon<%= name %>'


// Pass your instance of Handlebars and define custom delimiters
useDelims(Handlebars, ['<%=', '%>']);
var b = Handlebars.compile('{{ name }}<%= name %>')({name: 'Jon'});
console.log(b);
//=> '{{ name }}Jon'
希望它能对某人有用

/**
* change the delimiter tags of Handlebars
* @author Francesco Delacqua
* @param string start a single character for the starting delimiter tag
* @param string end a single character for the ending delimiter tag
*/
Handlebars.setDelimiter = function(start,end){
    //save a reference to the original compile function
    if(!Handlebars.original_compile) Handlebars.original_compile = Handlebars.compile;

    Handlebars.compile = function(source){
        var s = "\\"+start,
            e = "\\"+end,
            RE = new RegExp('('+s+'{2,3})(.*?)('+e+'{2,3})','ig');

            replacedSource = source.replace(RE,function(match, startTags, text, endTags, offset, string){
                var startRE = new RegExp(s,'ig'), endRE = new RegExp(e,'ig');

                startTags = startTags.replace(startRE,'\{');
                endTags = endTags.replace(endRE,'\}');

                return startTags+text+endTags;
            });

        return Handlebars.original_compile(replacedSource);
    };
};

//EXAMPLE to change the delimiters to [:
Handlebars.setDelimiter('[',']');

无需更改分隔符,您可以在中使用把手模板创建文件,而无需扩展名
.blade
。只需在刀片模板中包含这些文件。例如

刀片模板文件-Template.Blade.php

@extends('master.template')

@section('content')

    @include('handlebars-templates/some-template-name') 

@stop
一些模板名称文件-some-template-name.php

<script type="text/x-handlebars" data-template-name="content">
<div>
 <label>Name:</label>
 {{input type="text" value=name placeholder="Enter your name"}}
</div>
<div class="text">
<h1>My name is {{name}} and I want to learn Ember!</h1>
</div>
</script>

姓名:
{{input type=“text”value=name placeholder=“输入您的姓名”}
我的名字是{{name}},我想学习余烬!

尽管不能配置把手的表达式分隔符,但这并不是解决把手和刀片之间冲突的唯一方法。Blade提供的语法允许您通过指定应传递给把手的内容来避免冲突。(这很合适,因为Blade一开始就制造了冲突,而且这是必要的,因为Blade在车把看到模板之前正在处理模板。)只需在您希望Blade忽略并按原样传递到车把的花括号之前预加
@
。下面是一个非常简短的片段:

。。。
拉威尔4号聊天室
@{{outlet}}
...
{{outlet}}
将传递给车把,但是
{{asset(“css/bootstrap.theme.3.0.0.css”)}
将由Blade处理。

我在GitHub/npm上创建的,目的是使定制熟食店与车把一起使用变得容易

var Handlebars = require('handlebars');
var useDelims = require('handlebars-delimiters');

var a = Handlebars.compile('{{ name }}<%= name %>')({name: 'Jon'});
console.log(a);
//=> 'Jon<%= name %>'


// Pass your instance of Handlebars and define custom delimiters
useDelims(Handlebars, ['<%=', '%>']);
var b = Handlebars.compile('{{ name }}<%= name %>')({name: 'Jon'});
console.log(b);
//=> '{{ name }}Jon'
var handlebar=require('handlebar');
var useDelims=require('handlebar-delimiters');
var a=handlebar.compile({{name}}')({name:'Jon});
控制台日志(a);
//=>“乔恩”
//传递把手实例并定义自定义分隔符
useDelims(把手,['');
var b=handlebar.compile({{name}}')({name:'Jon});
控制台日志(b);
//=>“{{name}}Jon”
编译函数的思想来源于

欢迎提出改进建议或拉取请求

“如果需要显示用大括号括起来的字符串,可以通过在文本前面加上@符号来避免刀片行为。”


希望有帮助

我使用并更新了user1875109的源代码,现在它可以与Handlebar v3.0.3一起使用:

/**
* change the delimiter tags of Handlebars
* @author Francesco Delacqua
* @param string start a single character for the starting delimiter tag
* @param string end a single character for the ending delimiter tag
*/
Handlebars.setDelimiter = function(start,end){
    //save a reference to the original compile function
    if(!Handlebars.original_compile) Handlebars.original_compile = Handlebars.compile;

    Handlebars.compile = function(source){
        var s = "\\"+start,
            e = "\\"+end,
            RE = new RegExp('('+s+')(.*?)('+e+')','ig');

            replacedSource = source.replace(RE,function(match, startTags, text, endTags, offset, string){
                var startRE = new RegExp(s,'ig'), endRE = new RegExp(e,'ig');

                startTags = startTags.replace(startRE,'\{');
                endTags = endTags.replace(endRE,'\}');

                return startTags+text+endTags;
            });

        return Handlebars.original_compile(replacedSource);
    };
};

//EXAMPLE to change the delimiters to [:
Handlebars.setDelimiter('[',']');

有一个选项可以告诉模板引擎不解析代码的某些部分,并将其视为纯文本

找到以下方法来做,希望它能帮助别人

在刀片模板引擎(laravel)中,可以使用@verbatim指令。这样您就不必向每个变量添加@。 例如:

@verbatim
    <div class="container">
        Hello, {{ name }}.
    </div>
@endverbatim
@逐字逐句
你好,{{name}}。
@逐字结束
类似地,对于细枝模板引擎(symfony),您可以使用

{% verbatim %}
    <div>
        My name is {{name}}. I am a {{occupation}}.
    </div>
{% endverbatim %} 
{%verbatim%}
我的名字是{{name}。我是一个职业。
{%endverbatim%}

我所做的变通方法是用JS替换regex。我使用了以下代码->var templatecontent=$(“#template”).html().replace(/,'}}');var template=handlebar.compile(templatecontent);但这是一个解决办法,不确定在这里做这件事是否正确。嗯……好的。那么如何绕过它呢?比如我的评论?当然可以,或者像GH上建议的那样,将模板完全存储在HTML之外:你说的诀窍是在Laravel4.1上?请让我知道这个版本。很漂亮!为我工作!非常感谢!这应该是公认的答案,它不是一个技巧,而是一个正确的解决方案。那么三个花括号呢?目前刀片模板不提供{{{var}}}@Christian-hmmm,你需要自己转义文本{{e($var)}}虽然这个链接可以回答这个问题,但最好在这里包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,则只有链接的答案可能无效。@AnderBiguri:这是一个链接吗?;-)@Stefan抱歉,它在调节时会自动写入。问题是,这个答案没有任何解释。只给出一个答案,但不解释原因。@AnderBiguri:同意。这很好,但我经常想在我的车把模板中放置刀片标签,但这并不方便。它似乎不适用于车把v3.0.3。我用你的源代码创建了一个新的答案,现在它可以工作了。谢谢大家!+1制作真正的库,将它们放在GitHub上,在那里我们可以发送PRs和文件问题,并将它们发布在npm上,而不是让人们从StackOverflow复制粘贴相同的解决方案。imo有3个主要的潜在模板执行层。第一次执行时,基本上是在域/语言上,在服务器交付时(良好的旧CGI时间)在客户端。我分别使用{%{@和{{。我还使用{“some text”}作为{%\uuuuuuuuuu“some text”%}的有效速记,意思是在第一次执行时调用{uuuuuuu”助手翻译“some text”。所有这些都是通过这个.thx实现的
{% verbatim %}
    <div>
        My name is {{name}}. I am a {{occupation}}.
    </div>
{% endverbatim %}