Knockout intellisense в VS2010, когда внутри пространства имен - PullRequest
4 голосов
/ 16 марта 2012

У меня есть файл javascript, который содержит мою нокаутированную модель представления.Я добавил ссылку на файл отладки нокаута, но 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 в моей подписи пространства имен «скрывает»пространство имен реального ко. Есть ли способ обойти это , кроме изменения моей подписи пространства имен на:

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

(Может быть, я что-то упускаю с пространствами имен? Мне даже нужно передать ko в мое пространство имен?)

1 Ответ

2 голосов
/ 16 марта 2012

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);

В версии intellisense jQuery объявляется тип возвращаемого значения 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 работать.

...