Как зарегистрировать функции javascript, представленные в виде строки в javascript / handlebars - PullRequest
0 голосов
/ 28 января 2019

Этот вопрос больше похож на общий вопрос javascript и не относится к рулю.Тем не менее, я использую рули и, чтобы объяснить вопрос более четко, я привел примеры с использованием рулей.

Я хочу использовать рули в качестве движка шаблонов.Пользователь может предоставить свой собственный шаблон, CSS и контекст, который заполняет заполнители шаблона во время выполнения.
Рули также поддерживают вспомогательные функции, которые могут выполняться во время выполнения, как упомянуто здесь http://handlebarsjs.com/.

Эти функциибудет предоставлена ​​мне в виде строки, и мне придется зарегистрировать их самостоятельно в javascript.

например, если функция:

Handlebars.registerHelper('fullName', function(person) {
   return person.firstName + " " + person.lastName;
});

Строка функции будет stringFunction = 'return person.firstName + " " + person.lastName;'

Я не могу зарегистрировать этих помощников.
Я пытался использоватьnew Function(stringFunction), но есть некоторые проблемы, которые я не могу решить, например:

  1. Как передать параметр (человек в приведенном выше примере) в функцию?

например, нижеприведенная функция не работает:

customRegister(string_function){
    handlebars.registerHelper('fullName', function(person) {
        (new Function(string_function)).apply(person);
    });
}

2.Как получить доступ к переменным, импортированным в область?
, например, для следующей функции в виде строки:

  string_function = 'var emotion = Handlebars.escapeExpression(this.emotion),
      name = Handlebars.escapeExpression(this.name);

      return new Handlebars.SafeString(
        "<button>I agree. I " + emotion + " " + name + "</button>"
  );'

customRegister(string_function){
    handlebars.registerHelper('fullName', function() {
        (new Function(string_function)).apply(person);
    });
}

Даже если я импортировал Handlebars, он не определен в функции.

Возможно ли это в javascript?

...