在高级模式下使用Google Closure的第三方JSON?

时间:2011-07-03 09:36:12

标签: json asp.net-mvc-3 google-closure-compiler google-closure

我在尝试重命名我的JSON属性的闭包编译器的高级优化时遇到了麻烦。我正在使用丰富的自动完成控件,并使用从包含姓名和电话属性的联系人的操作返回的JSON提供。 Closure编译器在我的方法和模板中重命名Name和Phone。在方法中,我可以通过使用属性名作为对象的字符串键来解决它,但我不知道如何使用模板:

/**
 * @param {{Name: string, Phone: string}} item Item returned for autocomplete
 */
example.makeRow = function (item) {
    item.render = function (node, token) {
        // item.Phone + '</div>' + '<div style="float: right">' + item.Name;
        node.innerHTML = template.autocomplete(item); 
    }
}

我的JSON对象具有属性“Name”和“Phone”的全名,但该函数将它们重写为“Hx”和“Az”之类的内容。我的模板同上:

{namespace template}

/**
 * Single row in the example autocomplete box.
 * @param Phone Contact's phone number
 * @param Name Contact's full name
 */
{template .autocomplete}
{$Phone}<span style="padding-left: 15px">{$Name}
{/template}

如果我将这两行添加到makeRow函数的开头,它会将精简名称设置为原始名称中的正确值:

item.Name = item['Name'];
item.Phone = item['Phone'];

这样做在空间和性能方面似乎都很浪费。此外,我无意为我的所有JSON对象执行此操作,我计划将来在我的应用程序中有很多(这只是一个简单的测试)。我不知道如何将新名称映射到旧名称。我可以创建一个源图,但只有一堆数字,我不知道它们是什么意思。如果我能弄清楚那么也许我可以在C#中编写一个简单的属性映射器来创建具有缩写名称的动态对象。

如果我必须使用简单的优化模式,那么在封闭库中给出了所有对象和属性的冗长名称。它应该是简单的。我认为如果他们有@json标签而不是@param会阻止重命名,或者@param的其他信号不重命名对象的属性会很棒:

 * @param {{Name: string, Phone: string}} item Item returned for autocomplete

会变成

 * @json {{Name: string, Phone: string}} item Item returned for autocomplete

我发现通过创建externs.js文件并在编译时指定它,我可以使属性名保持不变:

var foo = {};
foo.Name = null;
foo.Phone = null;

我认为具有这些名称的任何对象属性都不会被压缩,这是真的吗?鉴于我将使用的类,我想我可以编写一些助手来生成很长的属性名列表。此外,我可能想对某些事情使用动态类型,恐怕我可能忘记或拼错属性名称。


修改

不是项目想要支持的东西,他们建议将对象作为这样的参数:

{namespace template}

/**
 * Single row in the example autocomplete box.
 * @param json Object with actual values
 */
{template .autocomplete}
{$json['Phone']}<span style="padding-left: 15px">{$json['Name']}
{/template}

1 个答案:

答案 0 :(得分:1)

Closure支持的最接近的是外部。只需为您的JSON对象创建一个extern,将其传递给编译器,一切都将按您的意愿工作。以下是您案例的基本示例:

/** @constructor */
function AutoCompleteItem() {}

/** @type {string} */
AutoCompleteItem.prototype.Name;

/** @type {string} */
AutoCompleteItem.prototype.Phone;

请注意,使用括号语法(object['Name'])访问JSON属性是很常见且完全可以接受的 - 这将在最终输出中编译为object.Name,并避免必须创建extern。