Javascript Intellisense не показывает все - PullRequest
5 голосов
/ 15 сентября 2009

Мозговой штурм необходим .У меня проблема с библиотеками Javascript (jQuery, ExtJS и т. Д.), Которые, похоже, не очень хорошо работают с Javascript Intellisense, встроенным в Visual Studio 2008. Они предоставляют определенные вспомогательные функции, которые Intellisense не может понять.

то есть.Код ExtJS

// convenience function to create namespace object placeholders
Ext.namespace("Root.Sub.Subsub");

или jQuery

// doing the same thing in jQuery
$.extend(window, {
   Root: {
      Sub: {
         Subsub: {}
      } 
   },
});

или даже (мне жаль, что вы будете поддерживать этот код)

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

Конечный результат этих вызововв основном то же самое. Ни один из них не сделает Root пространство имен видимым для Javascript Intellisense в Visual Studio 2008. Если бы мы знали, как работает intellisense под капотом, мы, вероятно, могли бы преодолеть эту ситуацию.

Можно ли убедить Intellisense для отображения / распознавания этих пространств имен без записи объектов, например:

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

Я допускаю, что первый вызов jQuery очень похож на этот, но этоЛучше использовать расширенную функциональность для предотвращения удаления / перезаписи существующих функциональных возможностей / пространств имен.

Вопрос

Как мы должны использовать эти служебные функции, чтобы заставить Intellisense работать?
ЛюбыеОтвет «мозгового штурма», который пролил бы свет на это, можно только приветствовать?

Редактировать

Я обнаружил, что пространства имен, созданные с помощью служебных функций, отображаются, если они определены снаружи (т. е. в другом скриптефайл), и вы делаете ссылку на этот файл, как:

/// <reference path="different.script.file.js" />

В этом случае всехорошо.Но если вы вызываете служебные функции в одном и том же файле, они не отображаются в раскрывающемся списке intellisense.

Ответы [ 3 ]

1 голос
/ 15 сентября 2009

Что касается jQuery: взгляните на этот пост . Этот пост также хорошо читается.

Я пробовал кучу вещей, чтобы Visual Studio распознавала объекты JavaScript и пространства имен - единственное найденное мной решение, которое надежно работает, это то, что вы упомянули сами:

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


Обновление:

Разработчик 1 пишет:

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

Разработчик 2 расширяет:

RootNamespace.SubNamespace.AnotherSubNamespace = {
    alertHelloWorld: function ()
    {
        alert("Hello World!");
    }
};
0 голосов
/ 10 октября 2009

VS2008 ослабляет intelisense, даже если вы объявляете объект как стандартный js, а затем пытаетесь расширить его:

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

opt = jQuery.extend(true, module.options, jQuery.extend(true, {}, opt, module.options));
op.SomeFunction("John", 20) // doesn't intelisense anymore

Чтобы обойти это, нам нужно перенести операцию расширения на функцию:

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) // now the intelisense works as expected
0 голосов
/ 16 сентября 2009

Обход

Эти служебные методы действительно работают, если вы используете их в другом файле сценария и ссылаетесь на тот, в котором вы хотели бы использовать эти пространства имен.

File1.js (предполагается, что у нас есть собственное расширение jquery $ .ns (), которое регистрирует новые пространства имен)

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

File2.js

/// <reference path="File1.js" />

// use custom namespaces
Project.Controls.InfoWindow = function(){
    ...
};

в File2.js у нас будет полная поддержка intellisense для пользовательских пространств имен.

Минус

Мы должны создать пространства имен в другом месте, потому что я не могу заставить его работать в одном и том же файле сценария.

...