5

需要头脑风暴。我有一个 Javascript 库(jQuery、ExtJS 等)的问题,这些库似乎与 Visual Studio 2008 中内置的 Javascript Intellisense 不能很好地配合使用。它们提供了一些 intellisense 无法理解的实用程序帮助函数。

IE。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" />

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

4

3 回答 3

1

就 jQuery 而言:看看这篇博文这篇文章也很好读。

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

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


更新:

开发人员 1 写道:

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

开发人员 2 扩展:

RootNamespace.SubNamespace.AnotherSubNamespace = {
    alertHelloWorld: function ()
    {
        alert("Hello World!");
    }
};
于 2009-09-14T22:28:28.067 回答
0

解决方法

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

File1.js(假设我们有一个注册新命名空间的自定义 jquery 扩展 $.ns())

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

文件2.js

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

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

在 File2.js 中,我们将对自定义命名空间提供完整的智能感知支持。

退税

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

于 2009-09-16T09:18:34.123 回答
0

即使您将对象声明为标准 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
于 2009-10-10T10:33:36.273 回答