1

JSON 속성의 이름을 바꾸려는 클로저 컴파일러의 고급 최적화에 문제가 있습니다. 리치 자동 완성 컨트롤을 사용하고 Name 및 Phone 속성이있는 연락처가 포함 된 액션에서 JSON을 반환합니다. Closure 컴파일러는 메서드와 템플릿에서 이름과 전화의 이름을 변경합니다. 방법에서 나는 객체로 문자열 키로 속성 이름을 사용하여 주위를 얻을 수 있습니다,하지만 난 템플릿 그렇게하는 방법을 알고하지 않습니다Google 고급 검색 모드의 타사 JSON?

/** 
* @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"와 같은 것으로 다시 씁니다. 내 템플릿에 대한 동감 : 나는 makeRow 함수의 시작이 두 줄을 추가 할 경우

{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} 

, 그것은 원래의 이름에서 적절한 값으로 응축 된 이름을 설정합니다

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

이 보인다 이렇게 공간과 성능면에서 낭비입니다. 또한 모든 JSON 객체에 대해이 작업을 수행 할 의사가 없으므로 앞으로는 내 응용 프로그램을 많이 사용할 계획입니다 (이는 간단한 테스트 일뿐입니다). 나는 새로운 이름을 옛날로 매핑하는 방법을 알지 못한다. 소스 맵을 만들 수는 있지만 숫자가 많아서 무엇을 의미하는지 알 수 없습니다. 만약 내가 그 다음 알아낼 수 있다면 어쩌면 나는 C#에서 짧은 속성 매퍼를 작성하여 단축 된 이름으로 동적 객체를 만들 수 있습니다.

클로저 라이브러리에있는 모든 개체와 속성의 이름이 길면 단순한 최적화 모드를 사용해야하는 경우. 그것은 간단해야합니다. 나는 그들이하지 개체의 속성 이름을 변경하기 위해 이름을 변경 방해하는 대신 @param의 @json 태그, 또는 @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} 
+0

plovr에 적용 할 수있는 속성 맵과 패치를 출력하는 매개 변수가 있다는 것을 알았습니다. json을 serialize 할 때 사용할 코드를 작성하려고합니다. –

답변

1

폐쇄가 지원하는 가장 가까운 점은 통근입니다 . JSON 객체의 extern을 작성하고 컴파일러에 전달하면 원하는대로 모든 것이 작동합니다. 이 최종 출력에 object.Name에 컴파일 및에 가진 방지 - 그것은 일반적이고 브래킷 구문 (object['Name'])를 사용하여 바로 액세스 JSON 속성에 꽤 받아 들일 수 있다고

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

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

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

참고 : 여기에 귀하의 경우에 대한 기본 예제입니다 extern을 만듭니다.

+0

이 템플릿에서 어떻게 작동합니까? (object [ 'Name'])가 작동하지 않습니다. –