将编译对象发送到Closure模板

时间:2013-04-16 12:47:39

标签: javascript google-closure-compiler google-closure google-closure-templates

如果我用JavaScript调用模板:

namespace.template(record);

其中record是以下的实例:

/** @typedef {{var: string}} */

我在高级模式下使用Google Closure Compiler,它会重写var,那么我如何才能在模板中收到var?是否使用'var'代替var来阻止重写执行此操作的唯一方法?

我在想,理想情况下,如果我可以为模板的@param提供类型,就像我可以为JavaScript代码提供类型那样会很好,这应该让编译器知道要使用的重写名称...


var的任何值都不会发生这种情况。如果密钥名为default,它确实会发生,因为SoyToJsSrcCompiler使用'default'生成代码(仅限此特殊名称,而不是我目前使用的任何其他名称),从而阻止Closure Compiler重命名,但该属性在JavaScript代码中重命名,因为我使用default没有引号。

1 个答案:

答案 0 :(得分:1)

如果您的模板类似于:

/**
 * Foo
 * @param rec
 */
{template .Foo}
    <div>{$rec.var}</div>
{/template}

然后SoyToJsSrcCompiler将生成类似于:

的代码
/**
 * @param {Object.<string, *>=} opt_data
 * @param {(null|undefined)=} opt_ignored
 * @return {string}
 * @notypecheck
 */
namespace.Foo = function(opt_data, opt_ignored) {
  return '<div>' + soy.$$escapeHtml(opt_data.rec.var) + '</div>';
};

此生成的模板函数旨在包含在源文件的编译中。由于输出属性访问的格式为rec.var,因此编译器应正确重命名。