Мне нужно использовать handlebars.js, и я также использую механизм шаблонов Blade из Laravel (PHP Framework). Теги {{}} конфликтуют с записями лезвия, которые точно совпадают.
Как я могу изменить эти {{var}} на что-то вроде <% var% > ?
Мне нужно использовать handlebars.js, и я также использую механизм шаблонов Blade из Laravel (PHP Framework). Теги {{}} конфликтуют с записями лезвия, которые точно совпадают.
Как я могу изменить эти {{var}} на что-то вроде <% var% > ?
Это невозможно при использовании "стандартных" ручек. https://github.com/wycats/handlebars.js/issues/227
Хотя может быть и правдой, что вы не можете настроить ограничители выражений Handlebars, это не единственный способ разрешить конфликт между Handlebars и Blade. Blade предоставляет синтаксис, который позволяет избежать конфликта, указав, что должно быть передано Handlebars. (Это подходит, поскольку Blade создал конфликт для начала, и это необходимо, так как Blade обрабатывает шаблон до того, как Handlebars его когда-либо увидит.) Просто добавьте @
перед фигурными фигурными скобками, которые вы хотите, чтобы Blade игнорировал и передавал as- для ручек. Здесь очень короткий фрагмент гораздо большего примера:
...
<link
rel="stylesheet"
type="text/css"
href="{{ asset("css/bootstrap.theme.3.0.0.css") }}"
/>
<title>Laravel 4 Chat</title>
</head>
<body>
<script type="text/x-handlebars">
@{{outlet}}
</script>
...
{{outlet}}
будет передан в Handlebars, но {{ asset("css/bootstrap.theme.3.0.0.css") }}
будет обработан Blade.
Вместо изменения разделителей вы можете создавать файлы с помощью шаблонов руля без расширения .blade
. Просто включите эти файлы в шаблон вашего клинка. Например
Файл шаблона клинка - template.blade.php
@extends('master.template')
@section('content')
@include('handlebars-templates/some-template-name')
@stop
some-template-name Файл - 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>
Я сделал эту функцию. Надеюсь, что это может быть полезно для кого-то..
/**
* 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('[',']');
Я создал handlebars-delimiters на GitHub/npm, чтобы упростить использование пользовательских разделителей с 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'
Идея функции компиляции взята из fooobar.com/questions/237033/...
Приветствуются предложения по улучшению или потянув запросы!
"Если вам нужно отобразить строку, которая завернута в фигурные скобки, вы можете избежать поведения Blade, префикс вашего текста с помощью символа @
@{{varname}}
Надеюсь, что это поможет!
Я использовал и обновил исходный код user1875109, и теперь он работает с 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('[',']');
Существует возможность указать движку шаблонов, что он не анализирует определенную часть кода, и рассматривать его как обычный текст.
Найдите следующие способы сделать это, надеюсь, это кому-нибудь поможет.
В движке шаблонов лезвий (laravel) вы можете использовать директиву @verbatim. Так что вам не нужно добавлять @к каждой переменной. Пример:
@verbatim
<div class="container">
Hello, {{ name }}.
</div>
@endverbatim
Точно так же для механизма шаблонов веток (Symfony) вы можете заблокировать весь код, используя
{% verbatim %}
<div>
My name is {{name}}. I am a {{occupation}}.
</div>
{% endverbatim %}