How to change the default delimiter of Handlebars.js?

前端 未结 8 1799
半阙折子戏
半阙折子戏 2020-12-10 02:41

I need to use handlebars.js and I also use Blade template engine from Laravel (PHP Framework). The tags {{}} conflict with blade\'s placeholders that are exactly the same.

相关标签:
8条回答
  • I've made this function. Hope it can be useful for someone..

    /**
    * 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('[',']');
    
    0 讨论(0)
  • 2020-12-10 02:46

    I created handlebars-delimiters on GitHub / npm to make it easy to use custom delims with Handlebars.

    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'
    

    The idea for the compile function came from https://stackoverflow.com/a/19181804/1267639

    Suggestions for improvement or pull requests are welcome!

    0 讨论(0)
  • 2020-12-10 02:47

    "If you need to display a string that is wrapped in curly braces, you may escape the Blade behavior by prefixing your text with an @ symbol"

    @{{varname}}
    

    Hope it helps!

    0 讨论(0)
  • This is not possible with "standard" Handlebars. https://github.com/wycats/handlebars.js/issues/227

    0 讨论(0)
  • 2020-12-10 02:51

    I used and updated the source code of user1875109 and now it works with Handlebars 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('[',']');
    
    0 讨论(0)
  • 2020-12-10 02:55

    Instead of changing the delimiters you can create files with your handlebars templates in without the .blade extension. Just include these files in your blade template. E.g

    Blade Template File - template.blade.php

    @extends('master.template')
    
    @section('content')
    
        @include('handlebars-templates/some-template-name') 
    
    @stop
    

    some-template-name File - 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>
    
    0 讨论(0)
提交回复
热议问题