1

我用文件 => 新建 => 静态 Web 项目打开一个项目。将其命名为 MyProject,Web 内容文件夹名称为 WebContent。

右键单击 WebContent 目录并添加一个 js 目录。右键单击js目录并选择new => other => JavaScript源文件并将其命名为DomStuff.js,内容如下:

var MyApp={};
MyApp.DomStuff={};
MyApp.DomStuff.someFunction=function(){
  return true;
}
MyApp.do<== here it auto completes to DomStuff

再次右键单击 js 目录并选择 new => other => JavaScript source file 并将其命名为 WorkFlow.js

当我输入MyApp.然后按控制+空格我得到一个框说No Default Proposals。这就像自动完成仅在所有代码都在一个文件中时才有效。

右键单击JavaScript ResourcesSource 选项卡下的 MyProject/WebContent 被列为全部包含且不包含任何内容。

这是 Eclipse 版本:4.2.1,带有 Eclipse Web Developer Tools 3.4.1 和 JavaScript Development Tools 1.4.1。

只要我记得,我从来没有自动完成在我目前正在处理的文件之外的代码上工作。这是正常的还是我在这里错过了一些设置?

4

2 回答 2

0

当涉及到跨文件的完成时,标准 JSDT 似乎是不确定的。那是因为即使项目配置正确,最昂贵的源代码分析类型也只会发生在打开的文件上。如果两个文件都打开,你会得到相同的结果吗?

顺便说一句,有一个 JSDT 的分支,它是合并到官方 JSDT 的候选者,称为 JSDT+NJSDoc,它非常有效地处理这种跨文件分析(并添加了其他功能):https://bitbucket.org/nexj/webtools。 jsdt核心

于 2013-06-14T17:52:11.417 回答
0

[更新] 基本上带有 JSDT 的 Eclipse 无法完成这项工作。试图用构造函数定义我所有的命名空间,但这太麻烦了。

现在尝试使用 netbeans,它将帮助大多数闭包库和我的所有代码。goog.array 之类的某些事情不会完成,因为 goog.array 从未定义过。将 goog.array=new Object() 添加到 array.js 时,它将完成 goog.array 和 goog.array.ArrayLike。这些修改后的 js 文件位于项目的 js/libs 目录中。

如果你想用麻烦的方法让它在 Eclipse 中工作,那么请继续阅读。

Eclipse 似乎在声明为对象文字的对象方面存在问题。用构造函数声明我的复杂类型似乎可以解决问题。Window必须在(大写 W)上创建根对象的实例。

// this would be the way I would define
// a complex property that doesn't need
// more than one instance and is not complex
// enough to put in a separate file
myapp.workflow.objectLiteral={
  thisDoesNotCodeAssist:function(){},
  neitherDoesThis:22
};

/** if you define the complex property as
 *  a constructor it will auto complete
 *  in other files and closure compiler will 
 *  recognize it's type
 */
/** @constructor organizes flow 
 * used for Eclipse code assist */
var WorkFlow=function(){};
ProwpWithSubs=function(){};
PropWithSubs.prototype.subProp=22;
PropWithSubs.prototype.subFunction=function(){
  this.subsub=44;
};
WorkFlow.prototype.propwithsubs=new PropWithSubs();
if(ALLWAYSFALSE){
  /**needed for Eclipse code assist
   * @constructor
   */
  var MyApp=function(){};
  MyApp.prototype.workflow=new WorkFlow();
  MyApp.prototype.dom=new DOM();
  Window.prototype.myapp=new MyApp();
}else{
  myapp.workflow=new WorkFlow();
}

[更新]

这是我用来拆分定义和实现的 3 个文件,因此使用 google 关闭更容易。

在 types.js 中设置主要类型

// source: js/mmyapp/types.js
goog.provide("myapp.types");
/** @constructor */
var gooblediegoog=function(){};
/** @constructor */
gooblediegoog.prototype.WorkFlow=function(){};
/** @constructor */
gooblediegoog.prototype.Dom=function(){};
myapp.types=new gooblediegoog();

在我的代码中根本没有使用但告诉 Eclipse 如何自动完成的文件:

// source: js/myapp/forCodeAssist.js
/** @const {boolean} */
var ALLWAYSFALSE=false;

if(ALLWAYSFALSE){
    /**needed for Eclipse autocomplete
     * @constructor
     */
    var MyApp=function(){};
    MyApp.prototype.types=new gooblediegoog();
    Window.prototype.myapp=new MyApp();
    MyApp.prototype.workflow=new myapp.types.WorkFlow();
    MyApp.prototype.dom=new myapp.types.Dom();
}

工作流的实现:

// source: js/myapp/workflow.js
goog.provide("myapp.workflow");
goog.require("myapp.types");
goog.require("myapp.dom");

/** @returns number|undefined */
myapp.types.WorkFlow.prototype.createOrder=function(){
    return myapp.dom.getArticleAmout();
};
myapp.workflow=new myapp.types.WorkFlow();
window['console'].log(myapp.workflow.createOrder());

这可以myapp.workflow.createOrder=...通过替换myapp.types.WorkFlow.prototypemyapp.workflow删除myapp.workflow=new myapp.types.WorkFlow()和删除. 转换为语法goog.require("myapp.types")。如果需要,也许这可以在构建/编译过程中自动化。

我不确定在构造函数的帮助下创建单个对象是否比像以前goog.require那样创建 myapp.workflow 并向其添加属性(以及在闭包库中所做的那样)要昂贵得多。

于 2013-06-15T00:36:04.137 回答