我有几个对象;一个叫做DomDependent,一个叫做WorkFlow,一个叫做mediator。
domdependent具有以下代码:
myApp.DomDependent.attachEvents=function(){
myApp.mediator.attach("doConversion",mmt.WorkFlow.doConversion);
DomDependent在中介上注册“事件”,而WorkFlow具有实现它们的功能。当我使用在DomDependent之后列出的WorkFlow编译代码时,事件被注册但函数为空。当我使用在DomDependent之前列出的WorkFlow进行编译时,某些事件根本不会被注册,而有些事件会使用函数来实现它们。
我不确定实现循环依赖的正确方法是什么,因为WorkFlow对象也调用了Domdependent以获取文本框值等等:
来自WorkFlow:
myApp.DomDependent.removeAdded();
我试图在DomDependent(对于WorkFlow)和WorkFlow中将一个goog.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。
我怎样才能确保不删除这些函数,通过调解器调用它们,但我认为编译器错过了其中的几个,我还没有找到原因。未编译的代码可以正常工作,但是在编译之后,调解器会尝试调用未使用的函数(也会编译调解器,因此它不是重命名函数的一部分)。
[UPDATE]
发现我怀疑事件未注册的一个错误。它已注册但由于重命名变量而无法执行任何操作。例如,此函数可将文本添加到行的开头或结尾:
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”]不存在或未定义。
我仍然想知道编译循环相关文件的正确方法。
答案 0 :(得分:1)
您需要引用begin
和end
属性。您当前正在引用它们作为引用属性和点缀,这违反了ADVANCED_OPTIMIZATIONS
的属性重命名限制。见Implications of global variable, function, and property renaming
var where={begin:"",end:""}, //unquoted - quote these to fix
where[whereTo]=... //quoted