Сторонний JSON с Google Closure в расширенном режиме? - PullRequest
1 голос
/ 03 июля 2011

У меня проблемы с продвинутой оптимизацией компилятора замыкания, пытающегося переименовать мои свойства 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}

1 Ответ

1 голос
/ 04 июля 2011

Самая близкая вещь, которую поддерживает Closure, это extern. Просто создайте extern для вашего объекта JSON, передайте его компилятору, и все будет работать так, как вы хотите. Вот базовый пример для вашего случая:

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

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

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

Обратите внимание, что обычно и вполне приемлемо просто обращаться к свойствам JSON с помощью синтаксиса скобок (object['Name']) - это скомпилируется в object.Name в конечном выводе и избавит от необходимости создавать extern.

...