在命名空间内部时VS2010中的Knockout intellisense

时间:2012-03-16 14:40:02

标签: javascript visual-studio-2010 namespaces knockout.js intellisense

我有一个包含我的knockout viewModel的javascript文件。我添加了对knockout调试文件的引用,但intellisense仅在我位于名称空间花括号之外时才有效:

/// <reference path="knockout-2.0.0.debug.js" />

// YES! I get intellisense here :-)

(function (window, $, ko, undefined) {
// ... lots of js
// NO intellisense in here :-(

})(window, jQuery, ko); 

我的命名空间签名中的ko似乎是“隐藏”真正的ko名称空间。 除了将我的命名空间签名更改为:之外,还有其他解决方法吗?

(function (window, $, myKo, undefined) {

(也许我错过了名称空间的东西?我甚至需要将ko传递到我的名称空间吗?)

1 个答案:

答案 0 :(得分:2)

Intellisense不够聪明,无法遵循参考。可以说你无论如何都不需要像这样注入你的'命名空间'。我认为它甚至不是命名空间,它只是一个闭包。考虑到正常用例,命名空间是一堆相关代码的全局容器。应用程序可能在全局范围内具有单个引用,这将被视为应用程序的命名空间。其他库(如jQuery)将在全局范围内注册自己的值,这可能被视为命名空间。在其他情况下,您可以将整个范围包装在闭包中,在闭包中注册命名空间,因此您永远不需要触及全局范围。

我可以看到为什么你可能想要为你的函数注入一个引用。这种方式遵循接口模式,因此您可以使用模拟版本将这些变量交换出来。不幸的是,我不认为你可以推断出对Intellisense的引用,并且出于同样的原因(即你可以将它与任何东西交换出来)它无法确切地告诉这些对象包含什么。

在静态类型的世界中,我们实际上定义了接口对象,它允许Intellisense反映注入的引用,断言它们至少具有在接口上定义的方法。

我认为你真正必须保留Intellisense的唯一选择是引用这些库定义的全局引用。

<强>更新

看起来Microsoft实际上使用了类型注释来允许您显式引用函数的参数类型。我测试了这个用jQuery暗示引用的版本

/// <reference path="jquery-1.6.2-vsdoc.js" />

(function ($) {
    /// <param name="$" type="jQuery">
    ///     A rererence to jQuery
    /// </param>



})(jQuery);

jQuery intellisense版本声明了jQuery的返回类型。假设Knockout具有intellisense,它定义了您可以以相同方式注释函数的类型。一般来说,我认为你可以声明一个这样的对象类型:

var someObject = (function() {
    /// <returns type="someObject" />

    // implementation here, returning object
})();

function (a) {
    /// <summary>
    ///      This function requires a to be a reference to a someObject type
    /// </summary>
    /// <param name="param" type="someObject">
    ///     A reference to a someObject type
    /// </param>
    /// <returns type="String" />

    // we now have intellisense on a, treating it as someObject
}

因此,如果您准备完成添加注释的过程,您可以让Intellisense工作。