Параметры интерполяции подчеркивания

Я пытаюсь использовать шаблоны стиля руля с подчеркиванием в позвоночнике (с require.js). У меня есть следующее:

_.templateSettings.interpolate = /\{\{(.+?)\}\}/g;

В моих шаблонах я установил тест:

<div><%= title %> | {{ title }}</div>

В браузере я получаю следующее:

Correct title | {{ title }}

Итак, похоже, что стандартные настройки шаблона подчеркивания работают, а элементы стиля руля игнорируются:

Но если я зарегистрирую консоль в chrome, я получаю это (что мне кажется, что это должно быть правильно)

_.templateSettings
Object {evaluate: /<%([\s\S]+?)%>/g, interpolate: /\{\{(.+?)\}\}/g, escape: /<%-([\s\S]+?)%>/g}

Любые идеи, почему это работает неправильно?

Ответ 1

Когда я это сделаю:

_.templateSettings.interpolate = /\{\{(.+?)\}\}/g;
var t = _.template($('#t').html());

с вашим шаблоном в #t, я получаю сообщение об ошибке:

СинтаксисError: Неожиданный токен '='

Это хорошо подтвердило мое подозрение, что это оценивает регулярное выражение:

/<%([\s\S]+?)%>/g

соответствовал вашему шаблону <%= ... %> в шаблоне. Знак равенства соответствует \S, поэтому, конечно, выражение regex найдет <%= ... %>, отмените <% и %> и оставит вас с синтаксической ошибкой в ​​JavaScript, который _.template будет пытаться построить.

Если вы заглянете внутрь источника _.template, вы увидите, что регулярные выражения проверяются в определенном порядке:

  • escape
  • interpolate
  • evaluate

Итак, просто замена interpolate приведет к тому, что объекты <%= ... %> попадут в ловушку (и неверно истолкованы), но evaluate.

Все, что вам нужно сделать, это заменить регулярное выражение evaluate. Я бы рекомендовал заменить все три регулярных выражения, чтобы избежать проблем:

_.templateSettings = {
    evaluate:    /\{\{(.+?)\}\}/g,
    interpolate: /\{\{=(.+?)\}\}/g,
    escape:      /\{\{-(.+?)\}\}/g
};

Демо: http://jsfiddle.net/ambiguous/SdLsn/