Использование литералов шаблона с Lodash _.template () - PullRequest
1 голос
/ 09 июня 2019

Я пытаюсь использовать шаблонные литералы с Lodash '_.template(), чтобы выбрать сообщение из файла JSON на основе ответа от другой функции, которая определяет открытие / закрытие, и она не работает для меня.

Поток:

  • Функция запускает логику и возвращает open или close через opencloseResponse.openclose объект (Предполагается, что работает и не отображается в моем фрагменте кода ниже)
  • Используя Lodash _.template() Я поставил messages.open или messages.close с именем пользователя как first_name
  • Текст сообщения отображается

Рабочий пример без литерала шаблона

messages.json

{
  "messages": {
    "open": "Hello ${ first_name }! We are open!",
    "closed": "Hello ${ first_name }! We are closed!"
  }
}

app.js

const _ = require('lodash');
const { messages } = require('messages.json');

const sendMessage = _.template(messages.open);
console.log(sendMessage({ first_name: 'Jeremy' }));

output

Hello Jeremy! We are open!

Неудачный пример с литералом шаблона

messages.json

{
  "messages": {
    "open": "Hello ${ first_name }! We are open!",
    "closed": "Hello ${ first_name }! We are closed!"
  }
}

app.js

const _ = require('lodash');
const { messages } = require('messages.json');

const sendMessage = _.template(`messages.${opencloseResponse.openclose}`);
console.log(sendMessage({ first_name: 'Jeremy' }));

output

messages.open

Я надеюсь, что это что-то простое, что мне не хватает. Это сводило меня с ума весь день. Я ценю любую помощь!

Ответы [ 2 ]

2 голосов
/ 09 июня 2019

Шаблоны Lodash и литералы шаблонов JavaScript - совершенно разные животные.Если вы хотите продолжать использовать эти файлы JSON, вы не будете использовать литералы шаблона JavaScript, вы просто будете использовать динамический доступ к свойству:

const sendMessage = _.template(messages[opencloseResponse.openclose]);
console.log(sendMessage({ first_name: 'Jeremy' }));

Если вы хотите использовать литералы шаблона, то, как вы делаетеих можно использовать многократно, чтобы обернуть их в функции .Например, вместо вашего messages.json у вас может быть messages.js:

exports.messages = {
  "open": (first_name) => `Hello ${ first_name }! We are open!`,
  "closed": (first_name) => `Hello ${ first_name }! We are closed!`
};

затем

const messages = require('./messages');

console.log(sendMessage(messages[opencloseResponse.openclose]('Jeremy')));

Или вы можете сделать так, чтобы функция принимала объект как с вашим Lodashкод, если вы предпочитаете:

exports.messages = {
  "open": ({first_name}) => `Hello ${ first_name }! We are open!`,
//         ^----------^-------------------------------------------------- destructuring
  "closed": ({first_name}) => `Hello ${ first_name }! We are closed!`
//           ^----------^------------------------------------------------ destructuring
};

тогда

const messages = require('./messages');

console.log(sendMessage(messages[opencloseResponse.openclose]({first_name: 'Jeremy'})));
2 голосов
/ 09 июня 2019

Вам не нужны литералы шаблона.

Просто используйте скобку [] для доступа к message свойствам

const sendMessage = await _.template(messages[opencloseResponse.openclose]);
...