我有几个对象;一种称为 DomDependent,一种称为 WorkFlow,一种称为 mediator。
domdependent 具有以下代码:
myApp.DomDependent.attachEvents=function(){
myApp.mediator.attach("doConversion",mmt.WorkFlow.doConversion);
DomDependent 在中介器上注册“事件”,WorkFlow 具有实现它们的函数。当我使用 DomDependent 之后列出的 WorkFlow 编译代码时,事件被注册,但函数为空。当我使用 DomDependent 之前列出的 WorkFlow 进行编译时,某些事件根本不会注册,而有些事件则使用函数来实现它们。
我不确定实现循环依赖的正确方法是什么,因为 WorkFlow 对象也会调用 Domdependent 来获取文本框值等:
来自工作流程:
myApp.DomDependent.removeAdded();
我尝试将 goog.require 放入 DomDependent(到 WorkFlow)和 WorkFlow 到 DomDependent 中,但由于循环依赖,它根本无法编译。
因此,删除了文件中 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
我的问题是:
这是获得依赖的正确方法吗?如果我在 DomDependent 中选择 goog.require
,那么 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"] 不存在或未定义。
我还是想知道编译循环依赖文件的正确方法是什么。
最佳答案
您需要引用您的 begin
和 end
属性。您当前将它们引用为带引号的属性和点式属性,这违反了 ADVANCED_OPTIMIZATIONS
的属性重命名限制。请参阅Implications of global variable, function, and property renaming
var where={begin:"",end:""}, //unquoted - quote these to fix
where[whereTo]=... //quoted
关于javascript - 关闭编译后有错误的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16234351/