1

オブジェクト内のコールバック メソッドが存在することを確認する関数があります。現在、Closure Compiler はメソッド (onClickDisplay および onCloseHide) の名前を変更しているため、makeCallbacks() のすべてのチェックが失敗します。

Closure Compiler にメソッド (onClickDisplay および onCloseHide) の名前を変更しないように指示する方法はありますか、または callbackNames() のメソッド名の名前も変更するように Compiler に指示する方法はありますか?

makeCallbacks = function(tobject, methodNames) {
 var callbacks = {};

 methodNames.each(function(methodName) {
    if (!tobject[methodName]) {
     throw new Error(methodName + ' missing from ' + tobject.toString());
    }
    callbacks[methodName] = tobject[methodName].bind(tobject);
 });

 return callbacks;
};


FeedbackController = Class.create({
  initialize: function(id, item) {
   this.callbacks = makeCallbacks(this, this.callbackNames());
  },

  observeElements: function() {
   $$(this.id + ' .closeme').invoke('observe', 'click', this.callbacks.onCloseHide);
  },

  callbackNames: function() {
   return ['onClickDisplay', 'onCloseHide'];
  },

  onClickDisplay: function(e) {
   // do something
  },

  onCloseHide: function(e) {
   // do something
  }
});
4

2 に答える 2

2

次のようにして、変数の名前を変更しないようにクロージャ コンパイラに明示的に指示できます。

goog.exportProperty(FeedbackController, 'onClickDisplay', FeedbackController.onClickDisplay);

または、メソッドにカスタム externs ファイルを含めることによって:

function onClickDisplay() {};
function onCloseHide() {};

そしてそれをクロージャコンパイラに提供します:

"--externs=/externs/externs.js"

これにより、変数の名前が変更されなくなります。通常、これは外部ライブラリとのやり取りにのみ使用します。

ソース :決定版ガイドを閉じる

于 2013-03-27T16:23:36.640 に答える
1

使用しているコーディング スタイルは、ADVANCED_OPTIMIZATIONS を使用した Closure-compiler の中心的な要件の 1 つ、つまり一貫したプロパティ アクセスに違反しています。obj.propつまり、ドット表記と引用符を組み合わせて同じプロパティを参照することはできませんobj['prop']。呼び出しに渡されたプロパティ名を引用できますClass.createが、デッド コードの削除と型チェックが無効になります。これらの動作のいずれも望まない場合は、実際に SIMPLE_OPTIMIZATIONS を使用する必要があります。

Closure-compiler はプロパティを割り当てていることをFeedbackController認識しないため、コードはプロパティを定義したという事実も隠しています。Class.create

コーディング スタイルを変更したくない場合は、SIMPLE_OPTIMIZATIONS を使用することをお勧めします。

に適したコンパイル レベルはどれですか? を参照してください。最適化レベル間の決定要因の詳細については、投稿してください。

于 2013-03-28T14:17:56.140 に答える