@Sviaznoi

Почему не работают как надо шаблонные строки?

Почему не работают шаблонные строки в моей программе:


Не понимаю почему значение от classPet = whoIs.elements.classPet.value которое точно присваивается переменной не доходит до ${classPet}. В ${name} проблем никаких. Значение в переменную classPet точно присваивается, но выводи всё равно undefined. Fiddle пишет что ожидалось присваивание но было получено выражение . Отладчики браузеров ничего не пишут.
  • Вопрос задан
  • 646 просмотров
Пригласить эксперта
Ответы на вопрос 1
lazalu68
@lazalu68
Salmon
Template strings это не шаблон который вы можете в любой момент взять и забить нужными данными, это просто инструмент с помощью которого данные распихиваются по строке. То есть у вас на 36ой строке cOA.begin создаётся именно с теми данными которые доступны на тот момент, а т.к. classPet и name не существуют в текущей области видимости, то вместо них используется undefined.

Кстате, как по мне, так эти template strings не самый удобный механизм для обработки шаблонов, как бы ни было обманчиво их название; если пользоваться ими, то на каждый шаблон придётся иметь свою функцию. Имхо проще обрабатывать шаблоны кастомно:

(() => {
  const re_template = /{(.*?)}/g;

  String.prototype.process = function(data) {
    return this.replace(re_template, (entry, word) => data[ word ]);
  }
})();

let templates = {
  greeting: 'Hello, my name is {name} and my age is {age}'
};

// Напрямую:
templates.greeting.process({ name: 'Yeshua', age: 2019 });
// Hello, my name is Yeshua and my age is 2019
templates.threat.process({ reason: 'i dont like you' });
// TypeError: Cannot read property 'process' of undefined


// Или автоматически вызывая process с помощью Proxy:
// (то же можно было реализовать просто с помощью дополнительной функции)
templates = new Proxy(templates, {
    get(target, prop) {
    	if (prop in target) {
        	return String.prototype.process.bind(target[prop]);
        } else {
        	throw new Error(`String "${ prop }" was not found in storage!`);
        }
    }
});

templates.greeting({ name: 'Yeshua', age: 2019 });
// Hello, my name is Yeshua and my age is 2019
templates.threat({ reason: 'i dont like you' });
// Error: String "threat" was not found in storage!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы