在 ruby​​ 中创建类似 Mustache Helpers (Lambda) 函数的 Javascript

问题描述

我找不到任何文档或示例来创建 Mustache Lambda,它可以访问当前上下文并创建像 lambda 助手一样的 mustache js。

http://mustache.github.io/mustache.5.html

解决方法

在查看 Mustache 库代码后,我发现可以使用 context.current 访问当前上下文并使用它递归调用 render 方法。 这是实现它的方法。希望能帮到其他人。

class MustacheTemplateHelper < Mustache
self.raise_on_context_miss = true

def context
    super
end

def self.render(expression,replacementContext = {})
    new.render(expression,replacementContext)
end

def render(expression,replacementContext = {})
    replacementContext = replacementContext.merge(self.class.helperMethod(context))
    super
end

def self.helperMethod(context)
    return lambdaMethods = Hash[
        "ToYaml" => lambda do | expression |
               # this statement renders the string part between ToYaml tags 
                renderedString = render(expression,context.current)   # context.current contains current context
                startIndentationSize = renderedString[/\A */].size
                return JSON.parse(renderedString.gsub('=>',':').gsub(":nil,",":null,"))
                    .to_yaml().delete_prefix("---\n").indent(startIndentationSize)
            end
    ]
end

模板:

{{#configs}}
- name: {{{name}}}
  inputs:
    {{#ToYaml}}
    {{{parameters}}}
    {{/ToYaml}}
{{/configs}}

示例配置:

{"configs"=>[{"name"=>"Test1","parameters"=>{"param1"=> "demo1","param2"=>"demo2"}},{"name"=>"Test2","parameters"=>{"param3"=> "demo3","param4"=>"demo4"}}]}