Подтвердить что ты не робот

Автозаполнение для одного объекта JavaScript, расширенного для нескольких файлов в Zend Studio (Eclipse PDT)

Моя 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. вызывает автозаполнение с objectA и objectB, но не Extend. Если я добавлю Extend в переменную App в global.js, она появится в автозаполнении, но не с помощью метода anotherMethod. Если бы я использовал var Extend = { /* code */ };, автообъект работал бы для объекта Extend, поэтому проблема, похоже, не связана с тем, что код распространяется на несколько файлов. Возможно, это потому, что один объект распространяется на несколько файлов... или что-то еще.

У кого-нибудь есть идеи?

4b9b3361

Ответ 1

Поскольку Javascript не является скомпилированным языком, среда IDE не знает, где ваши расширенные классы. Некоторые продвинутые IDE пытаются обойти это, рассматривая каждый файл javascript как часть единого проекта и, таким образом, комбинируя их в фоновом режиме, чтобы дать вам автозаполнение.

Я играл с различными IDE, и единственная IDE, с которой я работал, это Jetbrain Webstorm

Ответ 2

VJET JS IDE для 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()

Ответ 3

Не знаком с 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]

Если вы не можете получить автозаполнение для helloWorld на More. (и, как это работает на Extend, вы должны получить автозаполнение для streetWithNoName), то, вероятно, Zend не делает не- глобальное завершение, которое, я думаю, очень сложно сделать в любом случае. Если это возможно, вы всегда можете сделать:

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

в качестве обходного пути, если это приемлемо для вас, конечно.