1

JSON プロパティの名前を変更しようとしているクロージャ コンパイラの高度な最適化に問題があります。リッチ オートコンプリート コントロールを使用して、Name プロパティと Phone プロパティを持つ連絡先を含むアクションから返された 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}

これら 2 行を makeRow 関数の先頭に追加すると、圧縮された名前が元の名前から適切な値に設定されます。

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

1 に答える 1

1

Closureがサポートする最も近いものはexternです。JSONオブジェクトのexternを作成し、それをコンパイラーに渡すだけで、すべてが希望どおりに機能します。これがあなたのケースの基本的な例です:

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

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

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

ブラケット構文()を使用してJSONプロパティにアクセスすることは一般的であり、非常に受け入れられることに注意してください。object['Name']これにより、最終出力でコンパイルさobject.Nameれ、externを作成する必要がなくなります。

于 2011-07-04T00:04:40.137 に答える