asp.net mvc 3 -第三方JSON与谷歌关闭在高级模式



我在试图重命名JSON属性的闭包编译器的高级优化方面遇到了麻烦。我正在使用丰富的自动完成控件,并向它提供从我的操作返回的JSON,其中包含具有Name和Phone属性的联系人。闭包编译器在我的方法和模板中重命名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"one_answers"Phone"的全名,但函数将它们重写为"Hx"one_answers"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

我发现我可以通过创建一个external .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}

Closure支持的最接近的东西是extern。只需为JSON对象创建一个extern,将其传递给编译器,一切就会如您所愿地工作。下面是一个基本的例子:

/** @constructor */
function AutoCompleteItem() {}
/** @type {string} */
AutoCompleteItem.prototype.Name;
/** @type {string} */
AutoCompleteItem.prototype.Phone;

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

最新更新