Zend Studio(Eclipse PDT)中跨多个文件扩展单个JavaScript对象的自动完成

17

我使用的IDE是Zend Studio 8,它的JavaScript视图相对基础(与Eclipse PDT中的视图相似或者说是一样的)。 在我正在开发的应用程序中,我们会在多个文件中扩展一个基本对象,这有效地破坏了自动完成功能。请看下面的示例场景...

// global.js
var App = {
    objectA: {
        method1: function() {},
        method2: function() {}
    },
    objectB: {
        method1: function() {},
        method2: function() {}
    }
};

// extend.js
App.Extend = {
    anotherMethod: function() {}
};
在这种情况下,键入 App. 会导致自动填充显示 objectAobjectB,但不包括 Extend。如果我在 global.js 中将 Extend 添加到 App 变量中,它将出现在自动填充中,但却不会与 anotherMethod 一起出现。 如果我使用 var Extend = { /* code */ };,则自动完成将适用于 Extend 对象,因此问题似乎与代码跨越多个文件扩展无关。也许是因为单个对象被分散在多个文件中......或其他原因。
有人有任何想法吗?

只是出于好奇 - 如果是 App.extend 而不是 App.Extend 会发生什么? - minikomi
起初我认为这可能更适合归类为自动完成,但后来我想得更清楚并恢复了原样。对于编辑我感到抱歉。 - cwallenpoole
@minikomi 感谢您的回复。这个问题并不影响结果。它可以是App.extend、App.EXTEND、App.Extend等,但都无法工作。我也尝试了不同的术语,只是为了测试结果。 - webjawns.com
3个回答

1

由于JavaScript不是编译语言,因此IDE不知道您的扩展类在哪里。一些高级IDE尝试通过将每个JavaScript文件视为单个项目的一部分,并在后台将它们组合起来以提供自动完成来解决此问题。

我已经尝试过各种IDE,唯一能够实现这一点的IDE是Jetbrain's Webstorm


1

VJET JS IDE for Eclipse有一种使用vjetdoc语法跨多个文件扩展的方法。看看这个链接 -- http://www.ebayopensource.org/wiki/display/VJET/JS+code+assist+and+validation+for+two+or+more+js+files

它适用于对象字面量、变量和函数。一旦涉及到类的概念,通常会有一个包装函数来定义类。在VJET中,有vjo.ctype可以让你在js中创建类。VJET为使用此类型构造工具定义的类提供正确的辅助功能。以下是一个示例:

Base.js
vjo.ctype("namespace.Base")
.endType();

App.js
vjo.ctype("namespace.App")
.inherits("namespace.Base")
.protos({
   doIt:function(){}
})
.endType()

0

我不熟悉Zend Studio,但从你的话中并不清楚它是否仅适用于全局。也就是说,如果我理解正确,它可以这样工作:

// global.js
var App = {
    objectA: {
        method1: function() {},
        method2: function() {}
    },
    objectB: {
        method1: function() {},
        method2: function() {}
    }
};

// extend.js
var Extend = {
    anotherMethod: function() {}
};

然而,如果你加上这个,它会起作用吗?

// extend.js
...
var More = {
    streetWithNoName: false,
};
More.helloWorld = [1, 2, 3]

如果您无法在More.上为helloWorld获得自动完成(并且在Extend上可以为streetWithNoName获得自动完成),那么可能Zend没有进行非全局完成,我猜这本来就是一件非常困难的事情。如果可以的话,您总是可以执行以下操作:

var innerAppExtend = App.Extend = { ... };

作为一种解决方法,如果当然可以接受的话。


谢谢您的尝试,但这正是我想要避免的。我的想法是确保这些方法被封装在App对象内部,而不会不必要地创建全局变量。 - webjawns.com
我还测试了More.helloWorld(数组和对象类型),自动完成功能正常。streetWithNoName和helloWorld都出现在自动完成列表中。又有了一个线索! - webjawns.com
根据您所说的,您可以尝试在extend.js的开头添加var App;var App = App;(并按照您原始帖子中的所有步骤进行操作)? - icyrock.com
它是否可以跨文件自动完成?例如,如果在一个文件中你有 var A = { a: function() {} },然后在下一个文件(按照包含的顺序)中有 var B = { b: A },你能否自动完成 B.b. 并得到 a?如果这在一个文件中有效,但在拆分为两个文件时无效,则我想在 Zend Studio 中没有跨文件自动完成。 - icyrock.com
当A/B在同一个文件中时,它按预期工作。当它们在两个不同的文件中时,自动完成仍然适用于A,但它不会延伸到B.b - webjawns.com

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接