Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.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
Laravel 如何更改handlebar.js的默认分隔符?_Laravel_Handlebars.js - Fatal编程技术网

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 }}<%= name %

我需要使用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>

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

{{outlet}}将传递给车把,但{{assetcss/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'
编译函数的思想来源于


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

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

@{{varname}}

希望有帮助

我使用并更新了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
类似地,对于twig模板引擎symfony,您可以使用

{% verbatim %}
    <div>
        My name is {{name}}. I am a {{occupation}}.
    </div>
{% endverbatim %} 


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