2013-04-26 59 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