5 Stimmen

Javascript Intellisense zeigt nicht alles an.

Brainstorming benötigt. Ich habe ein Problem mit Javascript-Bibliotheken (jQuery, ExtJS usw.), die scheinbar nicht gut mit dem in Visual Studio 2008 integrierten Javascript-Intellisense zusammenarbeiten. Sie bieten bestimmte Hilfsfunktionen, die Intellisense nicht zu verstehen scheint.

Zum Beispiel ExtJS-Code

// Bequemlichkeitsfunktion zur Erstellung von Namespace-Objekt-Platzhaltern
Ext.namespace("Root.Sub.Subsub");

oder jQuery

// dasselbe mit jQuery machen
$.extend(window, {
   Root: {
      Sub: {
         Subsub: {}
      } 
   },
});

oder sogar (ich bedaure denjenigen, der diesen Code warten muss)

$.extend(window, { Root: {}});
$.extend(Root, { Sub: {}});
$.extend(Root.Sub, { Subsub: {}});

Das Endergebnis dieser Aufrufe ist im Grunde dasselbe. Keiner von ihnen würde dafür sorgen, dass der Root-Namespace in Javascript-Intellisense in Visual Studio 2008 sichtbar wird. Wenn wir wüssten, wie Intellisense im Hintergrund funktioniert, könnten wir wahrscheinlich diese Situation überwinden.

Ist es möglich, Intellisense zu überzeugen, diese Namespaces anzuzeigen/zu erkennen, ohne Objekte direkt wie folgt zu schreiben:

Root = {
   Sub: {
      Subsub: {}
   }
};

Ich gebe zu, dass der erste jQuery-Aufruf diesem hier recht ähnlich ist, aber es ist besser, die erweiterte Funktionalität zu verwenden, um das Entfernen/Überschreiben vorhandener Funktionalitäten/Namespaces zu verhindern.

Frage

Wie sollten wir diese Hilfsfunktionen verwenden, um Intellisense zum Laufen zu bringen?
Jede brainstorming-Antwort, die hier Licht ins Dunkel bringen könnte, ist willkommen?

Bearbeiten

Ich habe herausgefunden, dass mit den Hilfsfunktionen erstellte Namespaces angezeigt werden, wenn sie außerhalb definiert sind (zum Beispiel in einer anderen Skriptdatei) und Sie eine Referenz zu dieser Datei herstellen, wie folgt:

/// 

In diesem Fall ist alles in Ordnung. Aber wenn Sie Hilfsfunktionen im selben Skript aufrufen, werden sie nicht in der Intellisense-Auswahlliste aufgeführt.

1voto

cllpse Punkte 20838

Was jQuery betrifft: Schauen Sie sich diesen Blog-Beitrag an. Auch dieser Beitrag ist lesenswert.

Ich habe eine Menge ausprobiert, um Visual Studio dazu zu bringen, JavaScript-Objekte und Namespaces zu erkennen - die einzige Lösung, die zuverlässig funktioniert hat, ist das, was Sie bereits erwähnt haben:

var RootNamespace = {
   SubNamespace: {
      SubSubNamespace: {}
   }
};

Update:

Entwickler 1 schreibt:

var RootNamespace = {
   SubNamespace: {
      SubSubNamespace: {}
   }
};

Entwickler 2 erweitert:

RootNamespace.SubNamespace.AnotherSubNamespace = {
    alertHelloWorld: function ()
    {
        alert("Hallo Welt!");
    }
};

0voto

Robert Koritnik Punkte 100480

Problemumgehung

Diese Hilfsmethoden funktionieren tatsächlich, wenn Sie sie in einer anderen Skriptdatei verwenden und sie in der Datei referenzieren, in der Sie diese Namensräume verwenden möchten.

Datei1.js (setzt voraus, dass wir eine benutzerdefinierte jQuery-Erweiterung $.ns() haben, die neue Namensräume registriert)

$.ns("Project.Controls", "Project.Pages", "Project.General.Utilities");
...

Datei2.js

/// 

// benutzerdefinierte Namensräume verwenden
Project.Controls.InfoWindow = function(){
    ...
};

In der Datei2.js hätten wir vollständige IntelliSense-Unterstützung für benutzerdefinierte Namensräume.

Nachteil

Wir müssen die Namensräume an anderer Stelle erstellen, weil es mir nicht gelingt, sie in derselben Skriptdatei zum Laufen zu bringen.

0voto

DotNetWise Punkte 1

VS2008 verliert die Intellisense, auch wenn Sie das Objekt als standardmäßiges JS deklarieren und dann versuchen, es zu erweitern:

var opt = {
    SomeProperty: 1,
    SomeFunction: function(name,age) {}
};

opt = jQuery.extend(true, module.options, jQuery.extend(true, {}, opt, module.options));
op.SomeFunction("John", 20) // hat keine Intellisense mehr

Um dieses Problem zu umgehen, müssen wir die Erweiterungsoperation in eine Funktion verschieben:

var opt = {
    SomeProperty: 1,
    SomeFunction: function(name,age) {}
};

function extendOptions() {
    opt = jQuery.extend(true, module.options, jQuery.extend(true, {}, opt, module.options));
}

extendOptions();
op.SomeFunction("John", 20) // jetzt funktioniert die Intellisense wie erwartet

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X