Как хранить строки в массиве, включающем шаблонные литералы (Javascript)?

Я пытаюсь хранить много текста в массиве (поэтому я могу легко извлечь его, используя значение). Проблема заключается в строках, которые я хотел бы использовать литералами шаблонов, чтобы строка менялась в зависимости от ввода (например, после того, как они добавили свое имя, она использует их имя.

Я могу заставить это работать без проблем, если включу строку в функцию. Например:

textbox.textContent =  `what does ${nameTemp} do?`;

Это работает без проблем, он меняет «nameTemp» на то, что ввел пользователь. Но это ниже нет! Он всегда возвращает "tim" в качестве имени (значение по умолчанию для "nameTemp").

textbox.textContent2 = Title[1]; 

Вы можете видеть в приведенном ниже коде в функции saveName(), что первая строка (с полной строкой, включая литерал шаблона) работает. Но строка ниже, использующая строку из массива (с литералом шаблона в) не обновляется . Он использует строку по умолчанию "tim". Что я делаю неправильно? Как я могу лучше хранить строки в массиве, который имеет chanagable элементы? Заранее спасибо за любые предложения.

var nameTemp = `tim`;

let Title = [];
Title[0] = "What are you called?";
Title[1] = `what does ${nameTemp} do?`;

const input = document.createElement('input');
input.type = "text";
input.id ="nameText";
input.className +='inputStyle';

 function addNameInput()
    {
     container.appendChild(input);
    }

 function saveName()
    {
     if (nameText.value !== null)
     {
     nameTemp = nameText.value;
     textbox.textContent =  `what does ${nameTemp} do?`; //This works, it displays the inputed name
     textbox.textContent2 = Title[1];  // This will always display 'tim'
     nameText.parentNode.removeChild(nameText);
     incrementState();
     }
    }

person user13057690    schedule 15.04.2020    source источник


Ответы (1)


Строки шаблона Javascript оцениваются при первом их создании и не обновляются волшебным образом. Title[1] инициализируется с помощью "tim", и даже после того, как вы измените переменную nameTemp, она останется прежней. Если вы хотите хранить строки шаблона в массиве, вы можете сохранить функцию, которая возвращает строку шаблона, например:

Title[1] = () => `what does ${nameTemp} do?`;

то вы можете получить значение через

textbox.textContent2 = Title[1]();
person Aplet123    schedule 15.04.2020
comment
Вы легенда! Это отлично работает!! Очень признателен. Я пробовал несколько вещей «почти» в этом направлении, но просто не мог понять. Большое спасибо! - person user13057690; 16.04.2020
comment
еще раз спасибо за вашу помощь в этом. Любые идеи, как вы превращаете это во вложенный массив? Я пытался, но не могу заставить его работать. Я пытаюсь получить что-то вроде Title[1][1], однако, если я попробую обычный вложенный массив, он вернет строку, а не значение. Если я получаю вложенный массив, я не могу получить длину: code let testC = []; testC[1,1] = () =› You are ${_name}.; testC[1,2] = () => Now ${_name} do something ; code Это работает, поскольку я могу использовать testC[x,y] для управления им, но я не могу получить длину «y» (второй массив. - person user13057690; 24.04.2020
comment
testC[1, 1] не будет работать, так как 1, 1 оценивается как 1, что означает, что testC[1, 1] — это просто testC[1]. - person Aplet123; 24.04.2020