2011-06-09 10 views
17

Mi IDE es Zend Studio 8, que presenta una perspectiva relativamente básica para JavaScript (similar a, si no igual, la perspectiva en Eclipse PDT) En la aplicación en la que estoy trabajando, ampliamos un objeto base en varios archivos, lo que ha eliminado efectivamente la funcionalidad de autocompletar. Véase más abajo para un escenario de ejemplo ...Autocompletar para un único objeto JavaScript extendido a través de varios archivos en Zend Studio (Eclipse PDT)

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

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

En este escenario, al escribir App. causas de autocompletar a aparecer con objectA y objectB, pero no Extend. Si agrego Extender a la variable de la aplicación en global.js, aparecerá en la función autocompletar, pero no con otro método. Si tuviera que usar var Extend = { /* code */ };, la función autocompletar funcionaría para el objeto Extend, por lo que el problema no parece estar relacionado con el hecho de que el código se extienda a través de varios archivos. Tal vez se deba a que un solo objeto se está diseminando entre múltiples archivos ... o algo más.

¿Alguien tiene alguna idea?

+0

Simplemente por curiosidad: ¿qué ocurre si se trata de una aplicación más extensa que una aplicación? ¿Extender? – minikomi

+0

Al principio pensé que esto podría estar mejor archivado en autocompletar, pero luego pensé que era mejor y volví. Perdón por las ediciones. – cwallenpoole

+0

@minikomi Gracias por la respuesta. El caso no afecta el resultado. Podría ser App.extend, App.EXTEND, App.Extend, etc., y todos no funcionan. También probé una terminología diferente, solo para probar el resultado. –

Respuesta

0

No estoy familiarizado con Zend Studio, pero por lo que dices no está claro si funciona solo en globales o no. Es decir. si lo entendí bien, esto funciona:

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

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

Sin embargo, si agrega esto, ¿funcionará?

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

Si no se puede conseguir la función de autocompletar para helloWorld en More. (y como funciona en Extend, debe obtener la función de autocompletar para streetWithNoName), entonces probablemente Zend no está haciendo una terminación no global, que Supongo que es algo muy difícil de hacer de todos modos. Si se puede, entonces siempre se puede hacer:

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

como solución alternativa, si eso es aceptable para usted, por supuesto.

+0

Gracias por el intento, pero esto es exactamente lo que estoy tratando de evitar.La idea es garantizar que estos métodos estén encapsulados dentro del objeto de la aplicación sin crear innecesariamente variables globales. –

+0

También probé el More.helloWorld (ambos tipos de matriz y de objeto), y el autocompletado funcionó bien. Tanto streetWithNoName como helloWorld aparecieron en el autocompletado. Otra pista! –

+0

Dado lo que dices, ¿puedes intentar agregar 'var App;' o 'var App = App;' al principio de extend.js (y hacer todo lo que hace en tu publicación original)? –

1

Como Javascript no es un lenguaje compilado, el IDE no tiene idea de dónde se encuentran sus clases ampliadas. Algunos IDE avanzados intentan solucionar este problema considerando que cada archivo javascript forma parte de un único proyecto y, por lo tanto, los combina en segundo plano para darle la autocompletar.

He jugado con una variedad de entornos de desarrollo y el único IDE que he visto trabajar a partir es Jetbrain's Webstorm

1

VJET JS IDE para Eclipse tiene una forma de extender a través de múltiples archivos usando una sintaxis vjetdoc. Verifíquelo - http://www.ebayopensource.org/wiki/display/VJET/JS+code+assist+and+validation+for+two+or+more+js+files

Funciona con objeto literal, variables, funciones. Tan pronto como vaya a los conceptos de clase, normalmente hay una función de contenedor para definir las clases. En VJET hay vjo.ctype que te permite crear clases en js. VJET brinda asistencia correcta para las clases definidas con este tipo de kit de construcción. Aquí hay un ejemplo:

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

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