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

#php #javascript #eclipse #zend-studio #eclipse-pdt

#php #javascript #eclipse #zend-studio #eclipse-pdt

Вопрос:

Моей средой разработки является 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 объекта, поэтому проблема, похоже, не связана с тем фактом, что код расширен на несколько файлов. Возможно, это потому, что один объект распространяется по нескольким файлам … или что-то еще.

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

Комментарии:

1. Просто из любопытства — Что произойдет, если это App.extend, а не App.Extend?

2. Сначала я подумал, что это может быть лучше подано в разделе автозаполнение, но потом я подумал, что это лучше и отменил. Извините за правки.

3. @minikomi Спасибо за ответ. Случай не влияет на результат. Это может быть App.extend, App.EXTEND, App.Extend и т.д., И все они не работают. Я также попробовал другую терминологию, просто чтобы проверить результат.

Ответ №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 предоставляет корректную помощь для классов, определенных с помощью этого конструктора. kit. Вот пример:

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

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

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

Комментарии:

1. Спасибо за попытку, но это именно то, чего я пытаюсь избежать. Идея состоит в том, чтобы гарантировать, что эти методы инкапсулированы в объект приложения без ненужного создания глобальных переменных.

2. Я также протестировал More.HelloWorld (оба типа Array и Object), и автозаполнение работало нормально. В автозаполнении отображаются как streetWithNoName, так и HelloWorld. Еще одна подсказка!

3. Учитывая то, что вы сказали, можете ли вы попробовать добавить var App; или var App = App; в начале extend.js (и делать все, как в вашем оригинальном сообщении)?

4. Будет ли это автозаполнение вообще для файлов? Например. если в одном файле у вас есть var A = { a: function() {} } , а затем в следующем файле (в порядке включения) var B = { b: A } , можете ли вы автозаполнить B.b. и получить a ? Если это работает в одном файле, но не работает при разделении на два файла, то, я думаю, в Zend Studio нет межфайлового автозаполнения.

5. Когда A / B находятся в одном файле, это работает так, как ожидалось. Когда в двух отдельных файлах автозаполнение все еще работает для A, но оно не переносится на B.b .