需要头脑风暴。我有一个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: {}});
这些电话的最终结果基本相同。 在Visual Studio 2008中,它们都不会使Root
命名空间对Javascript Intellisense 可见。如果我们知道intellisense如何工作,我们可能能够克服这种情况。
是否有可能说服智能感知来显示/识别这些命名空间,而无需直接编写对象,如:
Root = {
Sub: {
Subsub: {}
}
};
我承认第一个jQuery调用与此非常相似,但最好使用扩展功能来防止删除/覆盖现有的功能/命名空间。
我们应该如何使用这些效用函数来实现智能感知?
任何能够解释这一点的头脑风暴的答案都值得欢迎吗?
我发现,如果在外部定义(即在不同的脚本文件中),则会显示使用实用程序函数创建的命名空间,并且您对该文件的引用如下:
/// <reference path="different.script.file.js" />
在这种情况下,一切都很好。但是如果你在同一个文件中调用实用程序函数,它们就不会列在intellisense下拉列表中。
答案 0 :(得分: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!");
}
};
答案 1 :(得分:0)
如果您在不同的脚本文件中使用这些实用程序方法并在您希望使用这些名称空间的文件中引用它们,这些实用程序方法实际上是有效的。
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中,我们将对自定义命名空间提供完整的智能感知支持。
我们必须在其他地方创建名称空间,因为我似乎无法在同一个脚本文件中使用它。
答案 2 :(得分: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