У меня проблемы с продвинутой оптимизацией компилятора замыкания, пытающегося переименовать мои свойства JSON.Я использую расширенный элемент управления автозаполнением и передаю его с помощью JSON, возвращенного из моего действия, который содержит контакты со свойствами «Имя» и «Телефон».Компилятор Closure переименовывает Имя и Телефон в моих методах и шаблонах.В методе я могу обойти это, используя имя свойства в качестве строкового ключа в объекте, но я не знаю, как это сделать с помощью шаблонов:
/**
* @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 имеет полные именаиз свойств «Имя» и «Телефон», но функция перезаписывает их в нечто вроде «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}