Дополнительная подстановка при рендеринге тегового литерала шаблона - PullRequest
0 голосов
/ 19 декабря 2018

Я только начал использовать литералы шаблонов и помеченные литералы шаблонов.Но я сталкиваюсь с проблемой при попытке визуализации литерала шаблона, потому что он выполняет дополнительную подстановку, и я не могу понять, откуда он берется.

Вот что я пробовал:

Мои данные

var data = {
    login: "john_12",
    name: "John",
    bio: "developer",
    email: "jdev@mail.com"
}

Функция моего тега

function replaceNullData(strings, ...parts) { 
     var checkedMarkup = ""; 
     strings.forEach((string, index) => { 
         if (!parts[index]){ 
             parts[index] = "data no available"; 
         } 
         checkedMarkup += string + parts[index]; 
     }); 

     return checkedMarkup; 
 }

Литерал моего шаблона

var summaryMarkup = replaceNullData`
         <div>
             <p>Username: ${data.login}</p>
         </div>
         <div>
             <p>Name: ${data.name}</p>
         </div>
         <div>
             <p>Bio: ${data.bio}/<p>
         </div>
         <div>
             <p>Email: ${data.email}</p>
         </div>
     `; 

Теперь, если я сделаю console.log(summaryMarkup);, я получу это:

     <div> 
         <p>Username: john_12</p> 
     </div> 
     <div> 
         <p>Name: John</p> 
     </div> 
     <div> 
         <p>Bio: developer/<p> 
     </div> 
     <div> 
         <p>Email: jdev@mail.com</p> 
     </div> 
 data no available <------- THIS IS WHAT SHOULDN'T APPEAR

В конце есть дополнительные «данные недоступны».Это как функция тега, полученная 6 parts (подстановка или выражение) вместо 5.

Что мне здесь не хватает?

1 Ответ

0 голосов
/ 19 декабря 2018

Ваш parts.length - это ожидаемая длина, но обратите внимание, что вы повторяете strings, а не parts.strings.length === parts.length + 1, поэтому вы получаете доступ к parts за пределами.Вместо этого выполните итерацию parts и добавьте последнюю строку вне итерации:

function replaceNullData(strings, ...parts) { 
    var checkedMarkup = ""; 
    parts.forEach((part, index) => {
        if (part == null) { // because false, 0, NaN, and '' should be "available"
            part = "data not available";
        }

        checkedMarkup += strings[index] + part;
    });

    return checkedMarkup + strings[strings.length - 1]; // manually append last string
}
...