10

ich folgendes Javascript-Objekt erstellt:Visual Studio - Intellisense für javascript benutzerdefiniertes Objekt

var Content = Content || {}; 

// Constructor defines properties and inits object 
Content.ProductManager = function() { 
    // ... 
}; 


Content.ProductManager.prototype = function() { 

    // 
    // private members 
    // 


    var setProductAsPreviewed = function (args) { 
     // code omitted for brevity 
     // .... 
    }; 


    // 
    // public members 
    // 

    return { 
     setProductAsPreviewed: setProductAsPreviewed 
    }; 

}(); 

Das zu setProductAsPreviewed gebene Objekt hat folgende Eigenschaften:

args = { 
    productId: int, 
    productName: string, 
    updateDate: date, 
    saveItems: bool 
}; 

Ich mag ich XML-Kommentare enthalten, so kann intellisense für das Argument erhalten, um Funktion zu übergeben setProductAsPreviewed:

This thread zeigt, wie man es für einfache Argumente (string, int, ...) macht, aber wie macht man das für ein komplexes Objekt? Ich verwende Visual Studio 2010.

+0

Ist Ihr 'args' Objekt on the fly erzeugt, oder es wird ein benutzerdefinierte Funktion, die den Typ definiert? – Sean

+0

Sie werden im laufenden Betrieb generiert, wenn ich die Funktion 'productManager.setProductAsPreviewed' aufrufen.Wäre es eine gute Idee, zuerst ein Objekt mit den gewünschten Eigenschaften zu definieren, um intellisense zu haben? Ich habe versucht, das zu vermeiden, weil dies der einzige Ort ist, an dem ich dieses Objekt benutzen werde. –

+0

Änderte meinen Kommentar zu einer Antwort. Ich kann mich jedoch irren, da die meisten meiner Kenntnisse über JS intellisense von VS2012 stammen, also würde ich es eine Weile dauern, bis andere denken können =] – Sean

Antwort

21

Soweit ich weiß, können Sie IntelliSense nicht sagen, welche Felder und Methoden sich auf einer generischen Variablen befinden, wenn sie als Parameter verwendet wird.

Wenn die Variable ein Array war, konnte man es wie folgt definieren:

function funcWithArrayArg(arrayArg) { 
    /// <param name="arrayArg" type="Array" elementType="Number">An array of numbers</param> 
} 

In VS2012 Sie auch Objekte mit Anmerkungen versehen können, wie so (Sie Felder auf Funktionen mit Anmerkungen versehen können als Objektkonstruktoren verwendet, wie ich unten zeigen aber die docs sagen nichts über anonyme Objekte wie diese):

var args = { 
    /// <field type="Number">Product ID</field> 
    productID: int 
}; 

wirklich Keiner dieser Ansätze tun, was Sie wollen, wie der zweite Ansatz, den Sie nicht geben intellisense auf dem Funktionsargument würde und Sie verwenden VS2010 sowieso.

Ich denke, Ihre beste Wette ist, ein benutzerdefiniertes Objekt zu definieren als Argument Objekt für diese Funktion nur verwendet werden, nachdem all dies ist, wie Sie es in anderen Sprachen tun würden, wenn Sie ein benutzerdefiniertes Objekt als Parameter erstellen wollen mit IntelliSense. Es könnte wie folgt aussehen:

function ProductPreviewArgs(productId, productName, updateDate, saveItems) { 
    /// <summary>Creates an object for use as the sole argument to the setProductAsPreviewed function</summary> 
    /// <param name="productId" type="Number" optional="false">The Product ID</param> 
    /// <param name="productName" type="String" optional="false">The Product Name</param> 
    /// <param name="updateDate" type="Date" optional="false">The date the product was last updated</param> 
    /// <param name="saveItems" type="Boolean" optional="false">Specifies whether or not to save the items</param> 
    /// <returns type="ProductPreviewArgs">An object intended for use as the sole argument to the setProductAsPreviewed function</returns> 
    /// <field name="productId" type="Number">The Product ID</field> 
    /// <field name="productName" type="String">The Product Name</field> 
    /// <field name="updateDate" type="Date">The date the product was last updated</field> 
    /// <field name="saveItems" type="Boolean">Specifies whether or not to save the items</field> 
    this.productId = productId; 
    this.productName = productName; 
    this.updateDate = updateDate; 
    this.saveItems = saveItems; 
} 

Sie würden intellisense auf dem Objekt bekommen (was zeigen, was Sie in dem returns Elemente gesetzt haben) hier:

setProductAsPreviewed(

Wenn Sie dann entscheiden, eine erstellen neue Objekt, würden Sie IntelliSense hier (die Sie für jeden Parameter einzeln die Beschreibungen zeigen, wie Sie sie hinzufügen):

setProductAsPreviewed(new ProductPreviewArgs(

ich bin nicht ganz sicher, ob die 012.Attribut auf dem returns Element wird tatsächlich so funktionieren, es tut in VS2012 und wie Sie inzwischen erwarten können, sind die Dokumente ärgerlich zu diesem Thema nackt; und ich habe keine Kopie von VS2010, um dies jetzt zu testen.

+0

Danke für deine Mühe Sean, aber das hilft nicht. Ich habe ein benutzerdefiniertes Objekt mit öffentlichen Funktionen, ich brauche Intellisense für sie. Außerdem möchte ich die Signatur der Funktionen nicht ändern, ich möchte ein einzelnes Argumentobjekt behalten. –

+0

Wusste nicht, dass Sie einen Parameter/Rückgabe eines Arrays eines bestimmten Typs angeben können - Intellisense ist brilliant! – andrewb

6

Sie können eine separate IntelliSense-Datei erstellen, sieht, dass so etwas wie dieses

intellisense.annotate(Content, { 
    'setProductAsPreviewed ': function() { 
    /// <signature> 
    /// <summary>Summary<summary> 
    /// <param name="args" type="ComplexObject">some text here 
    /// </signature> 
    } 
}) 

Ich glaube, das mit einigen Änderungen funktionieren sollte

+0

Ist dies nur für VS2012? –

Verwandte Themen