我用file => new =>静态web项目打开一个项目。命名为MyProject,网页内容文件夹名称为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源文件,并将其命名为WorkFlow.js
当我输入MyApp.
,然后按control +空格,我得到一个框说No Default Proposals
。这就像自动完成只工作当所有的代码在一个文件。
右键单击Source选项卡下的JavaScript Resources
, MyProject/WebContent显示为包含全部,排除无。
这是在Eclipse版本:4.2.1与Eclipse Web开发工具3.4.1和JavaScript开发工具1.4.1。
只要我记得,我从来没有得到自动完成工作的代码以外的文件,我目前正在处理。这是正常的吗,还是我漏掉了什么设置?
当涉及到跨文件的完井时,标准JSDT似乎不确定。这是因为即使项目配置正确,那么最昂贵的源代码分析类型也只发生在打开的文件上。如果两个文件都打开,您会得到相同的结果吗?
顺便说一下,有一个JSDT的分支,它是合并到官方JSDT的候选分支,称为JSDT+NJSDoc,它非常有效地处理这种跨文件分析(并添加了其他功能):https://bitbucket.org/nexj/webtools.jsdt.core
[update]基本上,带有JSDT的Eclipse不能完成这项工作。试着用构造函数定义我所有的命名空间,但这太麻烦了。
现在尝试netbeans,它将帮助大部分闭包库和我所有的代码。比如"好"。数组不会完成,因为goog。数组从来没有定义过。当加上goog时。array=new Object()到array.js中,它就完成了。array和google。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.types.WorkFlow.prototype
替换为myapp.workflow
,删除myapp.workflow=new myapp.types.WorkFlow()
并删除goog.require("myapp.types")
来转换为myapp.workflow.createOrder=...
语法。如果需要,也许可以在构建/编译过程中自动执行。
我不确定是否在构造函数的帮助下创建单个对象比仅仅让goog.require
创建myapp要昂贵得多。