使用Google Closure模板重写名为“default”的属性

时间:2013-04-17 15:14:52

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

在我发送给Google Closure模板的数据中,我有一个名为default的属性。我计划使用Google Closure Compiler编译SoyToJsSrcCompiler生成的JavaScript代码和代码。但问题是模板生成的代码会阻止编译器重命名default属性。

这是模板代码:

/**
 * @param test
 */
{template .template}
    <div>{$test.a.b.default.c.d}</div>
{/template}

这是生成的代码:

/**
 * @param {Object.<string, *>=} opt_data
 * @param {(null|undefined)=} opt_ignored
 * @return {string}
 * @notypecheck
 */
test.template = function(opt_data, opt_ignored) {
  return '<div>' + soy.$$escapeHtml(opt_data.test.a.b['default'].c.d) + '</div>';
};

我有什么方法可以得到:

opt_data.test.a.b.default.c.d

intead of:

opt_data.test.a.b['default'].c.d

或我可以将我的财产命名为default的任何其他方式?

现在,编译器在我的JavaScript代码中重命名default属性,但不会在SoyToJsSrcCompiler生成的代码中重命名它,因为此代码使用引用的版本。

2 个答案:

答案 0 :(得分:1)

default是JavaScript中的半保留字。它用于switch case语句:

switch ( variable ) {
    case a:
        break;
    case b:
        break;
    default:
        break;
}

在对象旅行中它是完全安全的,但不是作为范围级变量:

object.some.thing.else.default;

考虑这个对象树:

var a = {
    b: {
        c: {
            "1": {
                "default": 2
            } 
        }
    }
};

您可以通过说:

获取值(2
a.b.c[1].default // 2

但是:

a["b"]["c"]["1"]["default"] // 2

JSHint会针对非qoute所需情况引用对象进行引发警告。在这种情况下,["b"]["c"]["default"]

答案 1 :(得分:0)

目前似乎没有任何支持的方式来执行此操作。我将属性的名称从default更改为可以正确重命名的其他名称。