Автозаполнение для одного объекта JavaScript, расширенного на несколько файлов в Zend Studio (Eclipse PDT) - PullRequest
17 голосов
/ 10 июня 2011

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

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

Ответы [ 3 ]

1 голос
/ 02 июля 2011

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

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

1 голос
/ 07 апреля 2012

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()
0 голосов
/ 29 июня 2011

Не знаком с 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 = { ... };

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

...