2013-04-26 57 views
1

我有幾個對象;一個叫做DomDependent,一個叫做WorkFlow,一個叫做mediator。關閉後編譯的Buggy代碼

的domdependent具有下面的代碼:

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

DomDependent寄存器調解員「事件」和工作流程所具有的功能,以實現它們。當我在DomDependent之後編譯帶有WorkFlow的代碼時,事件被註冊,但函數爲空。當我在DomDependent之前列出的WorkFlow進行編譯時,有些事件根本不會被註冊,有的使用函數來實現它們。

我不知道什麼是實現循環依賴作爲工作流對象進行調用Domdependent以及獲取文本框的值和這樣的正確方法:

從工作流程:

myApp.DomDependent.removeAdded(); 

我試圖在DomDependent(WorkFlow)和WorkFlow中將doog.require放置到DomDependent,但由於循環依賴關係,它根本無法編譯。

所以去除goog.require語句對myApp中的文件,並提供它們作爲命令行參數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 

我的問題是:

這是獲得正確的方式依賴?如果我在DomDependent中選擇goog.require,那麼WorkFlow中的所有代碼都將被刪除,觸發任何使用mediator註冊的事件將嘗試調用undefined。

如何確保函數不會被刪除,它們是通過中介調用的,但我認爲編譯器會遺漏其中的幾個函數,但我還沒有找出原因。未編譯的代碼工作,但在編譯之後,中介器嘗試調用未知函數(中介器也被編譯,因此它不是重命名函數部分)。

[更新]

找到了我懷疑事件未註冊的一個錯誤。它已註冊但因重命名變量而不做任何事情。例如,這功能,增加了文本要麼到一行的開頭或結尾:

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; 
    ... 

在編譯版本的其中對象變量不具有開始和結束的屬性,以便在那裏[「開始」]不存在或未定義。

我仍然想知道編譯循環依賴文件的正確方法是什麼。

回答

1

您需要引用您的beginend屬性。您目前將它們引用爲引用屬性和虛線,這違反了ADVANCED_OPTIMIZATIONS的屬性重命名限制。見Implications of global variable, function, and property renaming

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

where[whereTo]=... //quoted 
+0

謝謝乍得,有道理。現在我知道是什麼導致了這個問題,我會嘗試將goog.require添加到我的文件中,並從cacldeps.py參數中刪除一些--input。必須按照如何調用文件的順序設置goog.require。首先調用DomDependent將事件附加到介體,以便在WorkFlow中設置goog.require。 – HMR 2013-04-27 00:38:52

+0

我在deps.js中添加了myApp.Classes,現在我只添加goog.require(「myApp.DomDependent」)和未編譯的代碼。編譯代碼的工作原因是(例如)DomDependent具有goog.require('myApp.WorkFlow')。它從DomDependent開始,因爲它具有在頁面加載時首先調用的函數。 – HMR 2013-04-27 01:28:05