я нашел короткий фрагмент для шнуровки интерполяции по GitHub и укоротить его на это:Интерполяция по умолчанию, если ключ не существует
var interpolate = function (tmpl, data) {
return new Function('data', 'with(data){return \'' +
tmpl.replace(/{{\s*(.+?)\s*}}/g, '\'+($1)+\'') + '\';}')(data);
};
Он отлично работает для этого:
interpolate('Hello {{user.name}}!', {user: {name: 'Admin'}});
// Hello Admin!
Но есть два результата я не люблю:
interpolate('Hello {{user.firstname}}!', {user: {name: 'Admin'}});
// Hello undefined!
и это одна:
interpolate('Hello {{user.name}}!', {userinfo: {name: 'Admin'}});
// Uncaught ReferenceError: user is not defined(…)
Есть ли способ изменить отрезанный для использования по умолчанию (пустая строка), если ключ не существует?
UPDATE Теперь я нашел решение для всех моих требований:
function interpolate(tmpl, data, defaultValue, reg) {
return tmpl.replace(reg || /{{([^{}]*)}}/g, function(a, b) {
try {
return new Function('data', ['with(data){return ',b,' || \'',(defaultValue || ''),'\';}'].join(''))(data);
}
catch(e) {
return defaultValue || '';
}
});
}
interpolate('Existing value: {{user.name}} - global value: {{Date.now()}} - undefined: {{user.age}} - exception: {{dat.haha}}', {user: {name: 'Admin'}}, '?');
// "Existing value: Admin - global value: 1441555682168 - undefined: ? - exception: ?"
Предложения являются Wellcome!
Спасибо, это является правильным ответом на мой вопрос. К сожалению, выражения типа {{Date.now()}} не работают с этим решением, но это не было частью моего вопроса, поэтому я принял ваш ответ. – Martin
Ха, как только я обновил свой ответ, я вижу, что вы нашли свой собственный ответ на проблему. Отличная работа. –