Javascript Intellisense 未显示所有内容

Posted

技术标签:

【中文标题】Javascript Intellisense 未显示所有内容【英文标题】:Javascript Intellisense not showing everything 【发布时间】:2010-11-28 07:02:21 【问题描述】:

需要集思广益。我有一个 javascript 库(jQuery、ExtJS 等)的问题,这些库似乎无法与 Visual Studio 2008 中内置的 Javascript Intellisense 配合使用。它们提供了一些 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 命名空间对 Visual Studio 2008 中的 Javascript Intellisense 可见。如果我们知道 intellisense 在后台是如何工作的,我们可能能够克服这种情况。

是否可以说服 Intellisense 显示/识别这些命名空间,而无需直接编写对象,例如:

Root = 
   Sub: 
      Subsub: 
   
;

我承认第一个 jQuery 调用与这个非常相似,但最好使用扩展功能来防止删除/覆盖现有的功能/命名空间。

问题

我们应该如何使用这些实用功能来使 Intellisense 工作? 欢迎任何可以对此有所启发的头脑风暴答案?

编辑

我发现,如果使用实用函数创建的命名空间是在外部定义的(即在不同的脚本文件中),并且您对该文件进行引用,例如:

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

在这种情况下,一切都很好。但是,如果您在同一个文件中调用实用程序函数,它们不会列在智能感知下拉列表中。

【问题讨论】:

【参考方案1】:

就 jQuery 而言:看看this blog post。 This post 也不错。

我尝试了很多方法来让 Visual Studio 识别 JavaScript 对象和命名空间——我发现唯一可靠的解决方案就是你自己提到的:

var RootNamespace = 
   SubNamespace: 
      SubSubNamespace: 
   
;

更新:

开发者 1 写道:

var RootNamespace = 
   SubNamespace: 
      SubSubNamespace: 
   
;

开发者 2 扩展:

RootNamespace.SubNamespace.AnotherSubNamespace = 
    alertHelloWorld: function ()
    
        alert("Hello World!");
    
;

【讨论】:

如果你的开发人员同事写了同样的东西会发生什么?喜欢:name.spacing.recognition = ; name.spacing.recognition.helloHell = function() ... ?您的第一个代码会自动消失,不是吗? 如果你覆盖了一个变量,你就覆盖了一个变量。但是你可以扩展对象字面量。 但是。我曾经从事过一个大型项目,你不能指望开发人员知道各种文件中的所有命名空间。那么,如果您的 Dev2 一开始就不知道 SubNamespace 存在怎么办?您的扩展当然有效,因为您正在向已经存在的其他东西添加新的东西...... 我想这并不是扩展现有类或创建命名空间的最佳方式......但它与智能感知配合得很好...... 是的。如果您向后弯腰以使 Visual Studio 能够智能感知您的命名空间,那么您将面临风险。但我所做的是创建一个反映命名空间和子命名空间的文件夹结构。这很有帮助。【参考方案2】:

解决方法

如果您在不同的脚本文件中使用这些实用方法并在您希望使用这些命名空间的文件中引用它们,这些实用方法实际上会起作用。

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 中,我们将为自定义命名空间提供完整的智能感知支持。

缺点

我们必须在其他地方创建命名空间,因为我似乎无法让它在同一个脚本文件中工作。

【讨论】:

【参考方案3】:

即使您将对象声明为标准 js 然后尝试对其进行扩展,VS2008 也会失去智能感知:

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

【讨论】:

以上是关于Javascript Intellisense 未显示所有内容的主要内容,如果未能解决你的问题,请参考以下文章

VS2015提示:未安装Style的Visual Studio语言支持,代码编辑Intellisense将不可用。服务器控件的标记Intellisense可能不起作用

IntelliSense 错误标识符“emlrtStack”未定义

Javascript Intellisense 消息:JS Intellisense:Internal/(1:0) : Function expected

Visual Studio 2012 JavaScript Intellisense 不工作

Visual Studio Javascript Intellisense - 选项对象

从 Javascript Intellisense 隐藏隐私