1

我有几个对象;一种称为 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"] 不存在或未定义。

我仍然想知道编译循环依赖文件的正确方法是什么。

4

1 回答 1

1

您需要引用您的beginend属性。您当前将它们引用为引用的属性和 dotted,这违反了ADVANCED_OPTIMIZATIONS. 请参阅全局变量、函数和属性重命名的含义

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

where[whereTo]=... //quoted
于 2013-04-26T14:26:36.967 回答