Как вы получаете VS 2008 Javascript Intellisense для работы со сложными прототипами? - PullRequest
3 голосов
/ 17 апреля 2009

Мне удалось заставить IntelliSense JavaScript работать правильно для прототипа 'class', определенного следующим образом:

function GetCustomerList()
{
}

GetCustomerList.prototype = 
{
    HEADER: {
        RETURN_CODE: 0,
        RETURN_MESSAGE: "",
        }
    ,
    NUM_RECORDS: 0,
    START_RECORD: 0,
    END_RECORD: 0
};

Я могу напечатать что-то вроде:

var req = new GetCustomerList();
req.HEADER.RETURN_CODE = 100;

И IntelliSense Visual Studio знает о свойстве HEADER и его собственных свойствах с именами 'RETURN_CODE' и 'RETURN_MESSAGE'. Я могу сделать:

req.NUM_RECORDS = 50;

С intellisense работает отлично.

Так что intellisense работает со сложными вложенными типами - отлично. Однако возможно ли получить intellisense с массивом сложных типов?

Пример:

function Customer()

Customer.prototype = {

    NAME: "",
    ADDRESS: "",
    ID: 0
};

function GetCustomerList()
{
}

GetCustomerList.prototype = 
{
    HEADER: {
        RETURN_CODE: 0,
        RETURN_MESSAGE: "",
        }
    ,
    NUM_RECORDS: 0,
    START_RECORD: 0,
    END_RECORD: 0,
    CUSTOMERS: [ new CUSTOMER() ]
};

Где у меня есть массив типа 'CUSTOMER', для которого я также определил прототип. Я хотел бы иметь возможность печатать такие вещи, как:

req.CUSTOMER[ 0 ].NAME 

И пусть intellisense подскажет мне, что «NAME» - это свойство, доступное для этого массива.

Возможно ли это?

Ответы [ 3 ]

3 голосов
/ 21 апреля 2009

UPDATE:

Как вы уже заметили, IntelliSense прекрасно работает для ваших сложных типов, но не работает в массиве. Даже если вы создаете массив встроенных типов, таких как String, он все равно не работает.

Я тщательно исследовал эту тему, теоретически это должно быть возможно, но это не так.
В качестве теста создайте файл javascript с именем "Customers.js " и включите следующее:

function Customer() {
    /// <summary>This is my custom intellisense for the Customer type</summary>
    ///<field name="NAME" type="String">The Customer's name</field>
    ///<field name="ADDRESS" type="String">The customer's address</field>
    ///<field name="ID" type="String">The ID number</field>
}
Customer.prototype = {
    NAME: "",
    ADDRESS: "",
    ID: 0
};

function CustomerList() {
    /// <summary>The List of Customers</summary>
    ///<field name="HEADER" type="String">The header</field>
    ///<field name="CUSTOMERS" type="Array" elementType="Customer" >The list of customers in an Array</field>
}

CustomerList.prototype =
{
    HEADER: {
        RETURN_CODE: 0,
        RETURN_MESSAGE: ""
    },
    NUM_RECORDS: 0,
    START_RECORD: 0,
    END_RECORD: 0,
    CUSTOMERS: [new Customer()]
};

Затем укажите этот файл внутри <script src="customers.js"/>

или /// <reference path="customer.js" /> внутри другого файла JS.

Посмотрите, как intellisense правильно показывает сводки, но когда дело доходит до массива, ничего.

var custList = new CustomerList();

custList.CUSTOMERS // intellisense
custList.CUSTOMERS[0] // no intellisense as you already know
0 голосов
/ 06 октября 2010

Хотя VS не поддерживает его, вы можете рассмотреть следующий обходной путь.

Я изменил пример сценария на:

function Customer(obj) {
    /// <summary>This is my custom intellisense for the Customer type</summary> 
    ///<field name="NAME" type="String">The Customer's name</field> 
    ///<field name="ADDRESS" type="String">The customer's address</field>
    ///<field name="ID" type="String">The ID number</field>
    if (obj) return obj;
}

Customer.prototype = {
    NAME: '',
    ADDRESS: '',
    ID: 0
};

function CustomerList() {
    /// <summary>The List of Customers</summary> 
    ///<field name="HEADER" type="String">The header</field> 
    ///<field name="CUSTOMERS" type="Array" elementType="Customer" >The list of customers in an Array</field> 
}

CustomerList.prototype =
{
    HEADER: {
        RETURN_CODE: 0,
        RETURN_MESSAGE: ''
    },
    CUSTOMERS: []
}; 

(Обратите внимание на изменение в конструкторе - не уверен насчет XML-комментария для intellisense).

Тогда вы можете ссылаться на него следующим образом (с помощью intellisense):

var list = new CustomerList();

var cust = new Customer();
cust.NAME = 'john';
list.CUSTOMERS.push(cust);

var cust1 = new Customer(list.CUSTOMERS[0]);
alert(cust1.NAME);

var cust2 = new Customer({ NAME: 'Mark' });
alert(cust2.NAME);

Аргумент против этого в том, что вам нужен параметр в конструкторе.

0 голосов
/ 15 мая 2009

Нет способа заставить это работать в VS2008. Это будет работать в следующей версии VS.

...