Javascript 将已编译对象发送到闭包模板

Javascript 将已编译对象发送到闭包模板,javascript,google-closure-compiler,google-closure,google-closure-templates,Javascript,Google Closure Compiler,Google Closure,Google Closure Templates,如果我使用以下命令从JavaScript调用模板: namespace.template(record); 其中,记录是以下内容的一个实例: /** @typedef {{var: string}} */ 我在高级模式下使用Google闭包编译器,它重写var,那么我如何在模板中接收var?使用'var'而不是var来防止重写是唯一的方法吗 我在想,理想情况下,如果我可以为模板的@param提供类型,就像我可以为JavaScript代码提供类型一样,这会让编译器知道要使用的重写名称 对于v

如果我使用以下命令从JavaScript调用模板:

namespace.template(record);
其中,
记录
是以下内容的一个实例:

/** @typedef {{var: string}} */
我在高级模式下使用Google闭包编译器,它重写
var
,那么我如何在模板中接收
var
?使用
'var'
而不是
var
来防止重写是唯一的方法吗

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



对于
var
的任何值,似乎都不会发生这种情况。如果密钥名为
default
,则会发生这种情况,因为SoyToJsSrcCompiler使用
'default'
生成代码(仅用于此特殊名称,不用于我迄今为止使用的任何其他名称),从而防止闭包编译器重命名它,但该属性在JavaScript代码中重命名,因为我使用的是不带引号的
default

如果您的模板看起来像:

/**
 * Foo
 * @param rec
 */
{template .Foo}
    <div>{$rec.var}</div>
{/template}
/**
*福
*@param rec
*/
{template.Foo}
{$rec.var}
{/template}
然后SoytoJSSRC编译器将生成类似以下内容的代码:

/**
 * @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>';
};
/**
*@param{Object.=}opt_数据
*@param{(null |未定义)=}opt_被忽略
*@return{string}
*@notypecheck
*/
namespace.Foo=函数(opt_数据,opt_被忽略){
返回'+soy.$$escapeHtml(opt_data.rec.var)+'';
};

生成的模板函数将包含在源文件的编译中。由于输出属性访问的形式是
rec.var
,编译器应该正确地重命名它。

事实上,这似乎是可行的(正如我预期的那样)。但现在我明白问题的真正所在了。如果属性名为
default
,则SoyToJsSrcCompiler生成的代码将其写入
['default']
,但闭包编译器会在原始对象中重命名该属性。。。可能这是因为
default
是一个保留字,我猜soy编译器害怕在不引用它的情况下破坏语法(即使
rec.default
是完全有效的语法)。。。我能否以不涉及重命名我的属性的方式解决此问题?只有在原始模板中使用类似于
{$rec['var']}
的语法时,才能进行描述。在这种情况下,您需要像
namespace.foo({rec:{'var':val}}}})那样调用模板,以避免当前出现的混合属性访问问题。该模板包含类似于
{$rec.foo.default.bar}
,它生成代码
opt_data.rec.foo['default'].bar
。它似乎只对名称
default
使用引号,而对其他任何内容都不使用引号。我们已经从一般性到非常具体。你可以发布你的模板吗?当然可以,我会单独提出一个问题。