我有几个对象;一种称为 DomDependent 一种称为 WorkFlow 一种称为中介。
domdependent 有以下代码:
myApp.DomDependent.attachEvents=function(){
myApp.mediator.attach("doConversion",mmt.WorkFlow.doConversion);
DomDependent 在中介器上注册“事件”,WorkFlow 具有实现它们的功能。当我使用 DomDependent 之后列出的 WorkFlow 编译代码时,事件被注册但函数为空。当我使用 DomDependent 之前列出的 WorkFlow 进行编译时,一些事件根本不会被注册,而一些事件则使用函数来实现它们。
我不确定什么是实现循环依赖的正确方法,因为 WorkFlow 对象也调用 Domdependent 以获取文本框值等:
从工作流:
myApp.DomDependent.removeAdded();
我尝试在 DomDependent(到 WorkFlow)和 WorkFlow 到 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.require
在 DomDependent 中,那么 WorkFlow 中的所有代码都将被删除,并且触发使用中介注册的任何事件都将尝试调用 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;
...
在编译版本中, where 对象变量没有 begin 和 end 属性,因此 where["begin"] 不存在或未定义。
我仍然想知道编译循环依赖文件的正确方法是什么。