【问题标题】:Javascript Intellisense not showing everythingJavascript Intellisense 未显示所有内容
【发布时间】: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" />

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

【问题讨论】:

    标签: javascript visual-studio-2008 namespaces javascript-intellisense


    【解决方案1】:

    就 jQuery 而言:看看this blog postThis 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-20
        • 1970-01-01
        • 2019-07-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多