1

いくつかのオブジェクトがあります。1 つは DomDependent と呼ばれ、もう 1 つは WorkFlow と呼ばれ、もう 1 つはメディエーターと呼ばれます。

domdependent には次のコードがあります。

  myApp.DomDependent.attachEvents=function(){
    myApp.mediator.attach("doConversion",mmt.WorkFlow.doConversion);

DomDependent はメディエータに「イベント」を登録し、WorkFlow はそれらを実装する機能を備えています。DomDependent の後にリストされているワークフローを使用してコードをコンパイルすると、イベントは登録されますが、関数は null です。DomDependent の前にリストされたワークフローでコンパイルすると、一部のイベントはまったく登録されず、一部のイベントはそれらを実装する関数で行われます。

WorkFlow オブジェクトが Domdependent を呼び出してテキストボックスの値などを取得するため、循環依存関係を実装する正しい方法が何であるかはわかりません。

ワークフローから:

myApp.DomDependent.removeAdded();

DomDependent (ワークフローへ) とワークフローから DomDependent への両方に goog.require を配置しようとしましたが、循環依存関係のためにまったくコンパイルされません。

そのため、ファイル内の myApp への goog.require ステートメントを削除し、それらを calcdeps.py へのコマンド ライン引数として提供します。

set calc="D:\software\closure compiler\library\closure\bin\calcdeps.py"
c:\Python27\python.exe %calc% ^
--path D:\flex_sdk_4.6\projects\EnglishConverter\bin\js\ ^
--input D:\flex_sdk_4.6\projects\EnglishConverter\bin\js\myApp\Mediator.js ^
--input D:\flex_sdk_4.6\projects\EnglishConverter\bin\js\myApp\WorkFlow.js ^
--input D:\flex_sdk_4.6\projects\EnglishConverter\bin\js\myApp\data.js ^
--input D:\flex_sdk_4.6\projects\EnglishConverter\bin\js\myApp\Messenger.js ^
--input D:\flex_sdk_4.6\projects\EnglishConverter\bin\js\myApp\DomDependent.js ^
--compiler_jar "D:\software\closure compiler\compiler.jar" ^
--output_mode compiled ^
--compiler_flags="--compilation_level=ADVANCED_OPTIMIZATIONS" ^
--compiler_flags="--formatting=PRETTY_PRINT" ^
--compiler_flags="--warning_level=VERBOSE" ^
--output_file D:\flex_sdk_4.6\projects\EnglishConverter\bin\js\main.js
pause

私の質問は次のとおりです。

これは依存関係を取得する正しい方法ですか? goog.requireDomDependentを選択すると、WorkFlow のすべてのコードが削除され、メディエーターに登録されたイベントのいずれかをトリガーすると、未定義の呼び出しが試行されます。

関数が削除されていないことを確認するにはどうすればよいですか。それらはメディエーターを介して呼び出されますが、コンパイラーがそれらのいくつかを見逃していると思いますが、その理由はまだわかりません。コンパイルされていないコードは機能しますが、コンパイル後にメディエーターは存在しない関数を呼び出そうとします (メディエーターもコンパイルされるため、名前変更関数の部分ではありません)。

[アップデート]

イベントが登録されていないと思われるバグが1つ見つかりました。登録されていますが、変数の名前を変更しているため、何もしません。たとえば、行頭または行末にテキストを追加する次の関数:

    myApp.WorkFlow.addBegin=function(){
        myApp.WorkFlow.addEndOrBegin("begin");
    };
    myApp.WorkFlow.addEndOrBegin=function(whereTo){
        var where={begin:"",end:""},
        lines=myApp.DomDependent.getAddwordsContent(false).split("\n"),
        i;
        where[whereTo]=mmt.DomDependent.getBeginEnd();
            for(i=0;i<lines.length;i++){
              lines[i]=where.begin+lines[i]+where.end;
   ...

コンパイルされたバージョンでは、 where オブジェクト変数に begin プロパティと end プロパティがないため、 where["begin"] が存在しないか未定義です。

循環依存ファイルをコンパイルする正しい方法を知りたいです。

4

1 に答える 1

1

beginプロパティとプロパティを引用する必要がありendます。現在、それらを引用符付きプロパティとドット付きプロパティの両方で参照していますが、これは のプロパティの名前変更の制限に違反していますADVANCED_OPTIMIZATIONSグローバル変数、関数、およびプロパティの名前変更の意味を参照してください

var where={begin:"",end:""}, //unquoted - quote these to fix

where[whereTo]=... //quoted
于 2013-04-26T14:26:36.967 に答える