Het opgeven van mensen als een zoekbereik / De bron van de inhoud met behulp van SharePoint 2013 REST API

Ik had reden om te werken met de SharePoint 2013 Search API via REST voor de eerste keer. Ik wilde om te zoeken naar personen, geen documenten. De sleutel leren hier is dat die u opgeeft inhoudsbronnen via de GUID (of op zijn minst in dit geval). De volgende jQuery fragment toont hoe:

    loadExpertsAsync: functie() {

        jQuery.support.cors = True;

        $.Ajax({
            URL: Dit.CreateFullApiUrl() +
                "?QueryText = 'sites'&sourceid = 'b09a7990-05ea-4af9-81ef-edfab16c4e31'" +
                "&selectproperties ='LinkedInProfileUrl,GoogleCirclesProfileUrl,BALargeProfilePictureUrls,BAGridPictures,WorkEmail,Vaardigheden,AboutMe,Belangen,JobTitle,PastProjects,Afbeeldings-URL,PreferredName,TwitterHandle,LinkedInProfileUrl,PreferredName,GoogleCirclesProfileUrl'" +
                "&rowlimit = 99",
            methode: "Toevoegen",
            headers: { "Accepteren": "application/json; odata = verbose" },
            cache: vals,
            succes: functie (resultaat) {

In mijn geval, I 'm running de API tegen SharePoint online. Om de GUID, Ik volgde deze stappen:

  1. Toegang tot de SharePoint admin center
  2. Selecteer 'zoeken' uit de linker navigatie
  3. Selecteer "Resultaat bronnen beheren"
  4. Selecteer "Lokale bevolking resultaten"
  5. Kijk naar de URL.

Mijn URL keek iets als:

https://xyzzy-admin.sharepoint.com/_layouts/15/searchadmin/EditResultSource.aspx?level=tenant&sourceid=b09a7990%2D05ea%2D4af9%2D81ef%2Dedfab16c4e31&view=1

De parameter sourceid is wat werkte voor mij.

(Ik begrijp dat de sourceid daadwerkelijk kan een soort permanente ding met SP, maar ik zal altijd te controleren hoe dan ook šŸ™‚ ).

</einde>

undefinedAbonneren op mijn blog.

Volg mij op Twitter op http://www.twitter.com/pagalvin

In het volgende voorbeeld SharePoint REST oproepen

Hier is een set van monster REST oproepen die werken voor mij en kan u helpen zo goed. Als van 02/2014, there are two examples šŸ™‚

  1. Verwijzen naar een kolom met ruimten In zijn naam
  2. Verwijst naar een meervoudige selectie kolom
  3. Een zoekopdracht mensen via REST

 

Ik zal toevoegen aan dit naarmate de tijd verstrijkt.

Hier zijn sommige nuttige inkten die ik zo goed heb gevonden:

Verwijzen naar een kolom met ruimten In zijn naam

Ik maken een aangepaste lijst met een kolom met de naam "blogauteur" (ruimte tussen Blog en auteur).

De $select om te verwijzen naar die kolom is:

image

Simpelweg vervangen naar de ruimte met "_x0020_". We zien de _x0020_ in veel voorbeelden over de internets en REST is niet anders.

Als u dat niet doet, je bent aansprakelijk om een foutmelding als deze:

De expressie “Blog Auteur” is niet geldig.

Gemakkelijk genoeg.

Verwijst naar een meervoudige selectie opzoekkolom

Instellen:

  1. Een aangepaste lijst met de naam Categorieƫn maken.
  2. Sommige categorieƫn toevoegen. Ik heb toegevoegd categorieƫn thusly:image
  3. Maak een andere aangepaste lijst genoemd MockBlog en categorieƫn toevoegen als een meervoudige selectie lijstkolom (of sitekolom als dat is hoe u rollen).

Sommige items toevoegen aan uw lijst met Mockblog en je bent klaar.

Een Ajax stijl gesprek met behulp van jQuery ziet er iets als dit:

serverUrl  = "/_api/web/lijsten/GetByTitle('MockBlog')/items" +
             "?$Selecteer = Titel,Categorieƫn/titel,Blog_x0020_Author/titel" + 
             "&$Vouw = Blog_x0020_Author,Categorieƫn";

We vertellen SharePoint "Geef me de titel voor alle categorieƫn (Categorieƫn/titel). Krijgen van de werkelijke waarden voor Titel door $uit te breidenING de lijst Categorieƫn." (Mijn rustgevende parafrase is waarschijnlijk vrij losse, maar dit hoe ik ben interpretatie van het).

Als u dit doet via JavaScript en met behulp van Fiddler om te kijken naar de output, in ruil daarvoor krijg je zoiets als dit:

 

image

(Het bovenstaande is een JSON-object)

Een zoekopdracht mensen via REST

Ik geblogd over dit afzonderlijk. De sleutel is om een parameter van de sourceid waarvan de waarde de GUID van de bron van de lokale bevolking inhoud is opgeven. (Inhoudsbronnen gebruikt te worden genoemd scopes en het is mijn-oh-mijn zo moeilijk niet te roepen alles een scope voor mij!).

Lees hier meer over het: http://www.mstechblogs.com/paul/?p=10385

 

</einde>

undefinedAbonneren op mijn blog.

Volg mij op Twitter op http://www.twitter.com/pagalvin

Snel en eenvoudig: Een SharePoint-Site met behulp van REST maken

Er zijn een heleboel middelen rond die laten zien hoe dit te doen, maar ik kon het niet vinden een uitgebreide Ga-naar-link, Dus hier zijn we.

U kunt een SharePoint-site met behulp van de REST API.  Hier is een volledig gebakken voorbeeld:

<!--
    SiteRequestForm.html: Informatie verzamelen en een site maken voor de gebruiker.
-->

<Center>
<tabel>
    <tr>
        <TD>Naam van de site:</TD>
        <TD><input type= "tekst" naam"SiteName =" id"SiteName =" /></TD>
    </tr>
    <tr>
        <TD ColSpan= "2">
            <input type= "submit" id"CreateSiteButton =" waarde= "Maak de Site" />
        </TD>
    </tr>
</tabel>
</Center>

<script src="../Plugins/jQuery-1.11.0.min.js"></script>

<script>
var CreateSiteLogicContainer = {

    createSiteData: {
            "parameters": {
                __metadata: { "type": "SP.WebInfoCreationInformation" },
                URL: "Paultest1",
                Titel: "Paultest1",
                Beschrijving: "rest-gemaakt web door Paul!",
                Taal: 1033,
                WebTemplate: "St",
                UseUniquePermissions: vals
            }
    },

    createSite: functie () {

        jQuery.support.cors = True;

        CreateSiteLogicContainer.createSiteData.parameters.Url = $("#SiteName").Val();
        
        $.Ajax({
            URL: "https://bigapplesharepoint.sharepoint.com/NBAIADev/_api/web/webinfos/add",
            methode: "POST",

            headers: {
                "accept": "application/json; odata = verbose",
                "content-type": "application/json;odata = verbose",
                "X-RequestDigest": $(#__REQUESTDIGEST"").Val()
            },

            gegevens: JSON.stringify(CreateSiteLogicContainer.createSiteData),

            succes: functie () { waarschuwing("succes"); },
            fout: functie () { waarschuwing("fout"); }

        });
    },

    wireUpForm: functie () {
        $("#CreateSiteButton").Klik op(functie () {
            waarschuwing("Ongeveer om te proberen en de site hebt gemaakt.");
            CreateSiteLogicContainer.createSite();
        });
    }


}

CreateSiteLogicContainer.wireUpForm();

</script>

Wanneer succesvol, krijg je een pakje JSON in reactie als dit:

image

Mijn belangrijkste gedachten en lessen uit deze opnemen:

  • Deze aanpak maakt gebruik van jQuery.  In mijn geval, mijn jQuery bibliotheek bevindt zich "../ plugins. "  U zult willen veranderen om te wijzen op uw favoriete JQ locatie.
  • U kunt kopiĆ«ren en plakken dat hele fragment in een webonderdeel Inhoudseditor op een pagina en het zou moeten werken prima.  U zult willen wijzigen het eindpunt van de API-aanroep en zorg ervoor dat u verwijst naar JQ correct.
  • De URL is ten opzichte van uw API eindpunt.  In mijn geval, het het creĆ«ren van subsites onder https://bigapplesharepoint.com
  • U hoeft niet te bieden een inhoud-lengte. Sommige blog posts en MSDN document impliceert dat jij, maar gebeurde voor mij automatisch, die ik neem aan dat wordt afgehandeld door de $.ajax aanroep zelf.
  • Deze regel is nodig om te voorkomen dat een "verboden" antwoord: "X-RequestDigest": $(#__REQUESTDIGEST"").Val().  Er zijn andere manieren om het te doen, maar dit is vrij aardig.  Ik heb de link naar blog die deze snelkoppeling verloren.  H/T aan u, mysterieuze blogger!

Veel geluk en hoop dat die dit helpt iemand uit.

</einde>

undefinedAbonneren op mijn blog.

Volg mij op Twitter op http://www.twitter.com/pagalvin

Overwinnen van vervelende probleem met relatieve URL's in SharePoint Quick Launch

Ik wilde een link toevoegen naar de vlug barkas navigatie de andere dag en SharePoint vertelde me:

image

Pure tekstversie van die is:

Ervoor zorgen dat de URL geldig is en met ofwel een geldig teken begint (een hekje (#) of schuine streep naar voren (/)) of een geldige ondersteund protocol (bijvoorbeeld, ' http://ā€™, ' https://ā€™, ' bestand://ā€™, ' ftp://ā€™, ' mailto:ā€™, ' Nieuws:ā€™).

"Blech en pox!"Ik zei.

Een alternerende actie aan dit is het gebruik van JavaScript te vinden van een bekende link in de werkbalk Snel starten en haar gedrag te overschrijven.

Om dit te testen, een nieuwe koppeling toevoegen aan uw testsite thusly:

image

Ik gebruikte jQuery. Te lossen, Krijg sommige JavaScript en jQuery naar de pagina met behulp van uw favoriete techniek en met een lijn van code zoals dit:

 

$(document).klaar( functie () {

    $("een:bevat('Test URL vervanging')").Klik op(functie () { waarschuwing("gewijzigde klik gedrag!"); terugkeer vals;});

});

En Bob's uw oom.

De jQuery selector vindt elke <een> label die "Test URL vervanging" in haar naam heeft. U kunt zoeken-melodie die afhankelijk van uw link en dergelijke.

De .Klik(functie() overschrijft wat SharePoint zou hebben gedaan wanneer de gebruiker heeft geklikt. Zorg ervoor dat u 'return false' of anders zal het doen van je spullen en dan proberen aan de href ding ook, Wat is vrijwel zeker niet uw doel.

Dit werd gedaan en test in een SharePoint online-omgeving maar moet werken goed in 2010 en eerder te.

</einde>

undefinedAbonneren op mijn blog.

Volg mij op Twitter op http://www.twitter.com/pagalvin

Snelle en eenvoudige: SharePoint REST gesprek enige Returns 100 Records

Ik heb gewerkt op een openbare geconfronteerd met web site voor mijn SharePoint praktijk hier in New York en het maakt gebruik van veel JavaScript en REST oproepen naar inhoud weergeven.

Tijdens de mainline ontwikkeling, Ik maak een kleine dataset met net 10 of zo rijen in een aangepaste lijst en mijn aanroepen REST alle trok vanaf daar.  Eens ik gestoten op de lijst dat een paar honderd rijen met gegevens om te testen voor verwachte groei, Ik vond dat ik kreeg precies 100 rijen geretourneerd terug op mijn aanroepen REST.

Dit is een heel simpel ding naar adres.  In mijn geval (en ik denk dat in de meeste gevallen), de standaard REST roept naar SharePoint (en eventueel als een industriestandaard?) terugkeer 100 rijen.  Om terug te keren meer dan de standaard, Gebruik de parameter $top voor uw oproep, Als in:

KRIJGEN /Insights Dev/_api/web/lists/GetByTitle('MockBlog')/items?$Selecteer = ID,Titel,Categorieƫn/titel,Blog_x0020_Author/titel,DatePublished,BlogSummary&$Vouw = Blog_x0020_Author,Categorieƫn&$filter =&$Top = 9999

Ik pakte 9999 in dit geval omdat ik weet dat growth-wise, Er zal niet meer dan 200 of zo rijen toegevoegd aan deze lijst in een jaar.  Als het wordt logge, We kunnen sommige wisselbestand op de weg.

</einde>

undefinedAbonneren op mijn blog.

Volg mij op Twitter op http://www.twitter.com/pagalvin

Snelle en eenvoudige: "Ongeldige URL-Parameter oplossen” probleem met UpdateListItems in lists.asmx

Bij het werken met UpdateListItems via lists.asmx, het is gemakkelijk voor het genereren van de fout:

Ongeldige URL-Parameter.

De URL bevat een ongeldige opdracht of waarde. Controleer of de URL weer.

U kunt deze fout krijgen wanneer u vergeet te vermelden-ID in de de lijst met velden om te werken.  Dit, net als een heleboel deze SP webservices, is een beetje contra-intuĆÆtief omdat u moet omvatten de ID in het ID-kenmerk van de <Methode> element.  En je bent niet bijgewerkt ID en waarschijnlijk nooit willen in de eerste plaats.

Deze SOAP-envelop werkt:

<soapenv:Envelop xmlns:soapenv =' http://schemas.xmlsoap.org/soap/envelope/'>
  <soapenv:Lichaam>                      
    <UpdateListItems xmlns =' http://schemas.Microsoft.com/SharePoint/soap/'>                     
      <listName>{C712E2EA-54E1-47AD-9D99-1848C7773E2F}</listName>                     
        <updates>                     
         <Batch OnError ="Blijven">
          <Methode ID ="1" Cmd ="Update">
            <Veldnaam ="CooperativeLock">vergrendeld!</Veld>
            <Veldnaam ="ID">1</Veld>
          </Methode>
        </Batch>                     
        </updates>                
      </UpdateListItems>             
  </soapenv:Lichaam>         
</soapenv:Envelop>

Als u uit de veldverwijzing ID strippen dan krijg je het vervelend bericht "Ongeldig URL-parameter".

</einde>

undefinedAbonneren op mijn blog.

Volg mij op Twitter op http://www.twitter.com/pagalvin

 

Arme Man de Caching in JavaScript

[TL;DR versie: gebruik van cookies voor het opslaan van de resultaten van asynchrone oproepen; de resultaten van afgelopen async oproepen onmiddellijk renderen en vervolgens valideren ze na het laden van de pagina.]

Ik heb gewerkt op SharePoint intranet-site voor een client die functies, onder andere, een gestileerde secundaire navigatie waarvan menu-opties worden beheerd via een regelmatige oude aangepaste lijst.  Het idee is dat de client krijgt om "hun" site systeemmenu zonder te tasten of wordt beĆÆnvloed door de wereldwijde navigatie stak door het.

(Er is iets ongelooflijk subversieve over het toevoegen van een CEWP die verwijst naar een HTML-bestand dat ladingen sommige CSS en JS fundamenteel veranderen bijna alles over van een site probleem... maar dat is voor een andere post)

De code voor dit vrij eenvoudig:

De zere plek hier is dat elke keer als iemand hits een pagina van de site, webbrowser van die gebruiker is het bereiken uit om items uit de lijst.  Zodra dev voltooid is en dingen te testen heeft bewezen stabiel en voltooien, deze oproep is onnodig meer dan 99% van de tijd sinds het menu zelden verandert.  Heeft ook een raar UI invloed die gebruikelijk is in deze heerlijke nieuwe wereld van hyper-ajaxy websites-de pagina maakt en alleen dan heeft het menu maken.  Het is zenuwachtig en afleidend in mijn mening.  En zenuwachtig. Dus, opslaan in de cache. 

Ik heb gewijzigd de logica thusly:

  • Zoek naar een cookie in de browser die het menu bevat als ik laatst lezen
    • Als gevonden, maken het onmiddellijk.  Wacht niet op de pagina te laden voltooien.  (U moet ervoor zorgen dat uw HTML-code wordt strategisch geplaatst hier, maar het is niet moeilijk om te doen).
  • Wachten op de pagina te laden voltooien en maak een async oproepen voor vracht opwaarts menu-items uit een lijst met behulp van REST of lists.asmx of wat dan ook
  • Vergelijken wat ik heb tegen de cookie
    • Als het overeenkomt met, STOP
    • Anders, met behulp van jQuery, dynamisch vullen een bos als <Li>de in een <UL>
  • Gebruik CSS te doen alle opmaak
  • Winst!

Sommigen van u zullen zeggen, "hey! Er is geen echte in het voorgeheugen onderbrengende gaat hier omdat je het lezen van het menu hoe dan ook elke keer.ā€  En je hebt gelijk-ik ben niet het geven van de server elke soort pauze.  Maar omdat de oproep async is en gebeurt na de pagina's eerste HTML-nettolading volledig maakt, het voelt"" ontvankelijker voor de gebruiker.  Het menu maakt vrij veel als de pagina vestigt.  Als het menu aan de verandering gebeurt, de gebruiker is onderworpen aan een zenuwachtig opnieuw te tekenen van het menu, maar slechts die Ć©Ć©n keer.

Er zijn een aantal manieren aan deze cache doeltreffender maken en helpen de server op hetzelfde moment:

  • Zet in een regel dat de cache"cookie" geldig voor een minimum van is 24 uren of sommige andere tijdsbestek. Zolang er geen verlopen cookie is, gebruik van de cookie menu momentopname en nooit hit de server.

Nou... dat is alles wat die te binnen schieten nu :). 

Als iemand slimme ideeƫn hier heeft zou ik graag willen weten ze.

En tot slot ā€“ deze techniek kan worden gebruikt voor andere dingen.  Deze client pagina heeft een aantal data-gedreven dingen op verschillende pagina 's, velen van hen veranderen relatief zelden (zoals een keer per week of eenmaal per maand).  Als u zich richten op specifieke gebieden van functionaliteit, u kunt een meer responsieve UI geven door trekken inhoud uit de lokale cookie store en meteen renderen.  Het voelt sneller aan de gebruiker, zelfs als u niet de server elke cycli opslaat.  U kan Sla de server cycli door te besluiten op een aantal voorwaarden en triggers om deze lokale cookie cache ongeldig te maken.  Dat is allemaal situationele en kunstzinnige spullen en echt de leukste :). 

</einde>

undefinedAbonneren op mijn blog.

Volg mij op Twitter op http://www.twitter.com/pagalvin

Procedures: Unit Test en Test dekking met QUnit.js en Blanket.js voor een Office configureren 365 SharePoint App

Intro

Ik heb het verkennen van eenheid die test en test dekking voor JavaScript als ik werk op een nieuwe SharePoint-app voor SharePoint online in het kantoor 365 Suite.  De paden voor de hand liggende onderzoek leidde me om te Qunit.js en direct na dat, Aan Blanket.js.

QUnit laat me eenheid tests instellen en groeperen in modules.  Een module is gewoon een eenvoudige manier om te organiseren gerelateerde tests. (Ik ben niet zeker dat ik gebruik het als bedoeld, maar het werkt voor mij tot nu toe met de kleine set van tests die ik tot nu toe hebt gedefinieerd).

Blanket.js integreert met Qunit en het zal mij de feitelijke lijnen van JavaScript die waren- en nog belangrijker-werden niet daadwerkelijk uitgevoerd tijdens het uitvoeren van de tests.  Dit is "dekking"-lijnen die uitgevoerd worden gedekt door de test, terwijl anderen niet zijn.

Tussen goede testcases instellen en weergeven van de dekking, We kunnen het risico dat onze code heeft verborgen gebreken.  Goede tijden.

Qunit

Veronderstellend hebt u uw Visual Studio project instellen, Begin door te downloaden van het pakket JavaScript uit http://qunitjs.com.  De JavaScript en bijbehorende CSS toevoegen aan uw oplossing.  Mine ziet er als volgt:

image

Figuur 1

Zoals u kunt zien, Ik was met behulp van 1.13.0 op het moment schreef ik deze blogpost. Vergeet niet om te downloaden en het CSS-bestand toevoegen.

Dat uit de weg, volgende stap is het maken van een soort van testuitrusting en verwijst naar de Qunit bits.  Ik ben het testen van een heleboel functies in een scriptbestand genaamd "QuizUtil.js" dus ik heb een HTML-pagina met de naam "QuizUtil_test.html gemaakt" zoals:

image Figuur 2

Hier is de code:

<!DOCTYPE HTML>
<HTML xmlns= 'http://www.w3.org/ 1999/xhtml">
<hoofd>
    <titel>QuizUtil test met Qunit</titel>
    <koppeling rel= "stylesheet" href="../CSS/qunit-1.13.0.CSS" />
    <script type= text/javascript"" src="QuizUtil.js" gegevens-cover></script>
    <script type ="text/javascript" src ="qunit-1.13.0.js"></script>
    <script type ="text/javascript" src ="blanket.min.js"></script>

    <script>
        module("getIDFromLookup");
        test("QuizUtil getIDFromLookupField", functie () {
            var goodValue = "1;#Paul Galvin";

            gelijke(getIDFromLookupField(goodValue) + 1, 2), "ID van [" + goodValue + "] + 1 2 moeten worden";
            gelijke(getIDFromLookupField(undefined), undefined, "Niet-gedefinieerde invoer argument moet ongedefinieerde resultaat te retourneren.");
            gelijke(getIDFromLookupField(""), undefined, "Lege invoer argument moet een niet-gedefinieerde waarde retourneren.");
            gelijke(getIDFromLookupField("gobbledigood3-thq;dkvn ada;skfja sdjfbvubvqrubqer0873407t534piutheqw;VN"), undefined,"Moeten altijd terug een resultaat Cabrio naar een geheel getal");
            gelijke(getIDFromLookupField("2;#enige andere persoon"), "2", "Checking [2;#enige andere persoon].");
            gelijke(getIDFromLookupField("9834524;#Long-waarde"), "9834524", "Grote waarde test.");
            notEqual(getIDFromLookupField("5;#iedereen", 6), 6, "Het testen van een notEqual (5 is niet gelijk aan 6 voor dit voorbeeld: [5;#iedereen]");

        });

        module("htmlEscape");
        test("QuizUtil htmlEscape()", functie () {
            gelijke(htmlEscape("<"), "&lt;", "Ontsnappen een minder dan, operator ('<')");
            gelijke(htmlEscape("<div class =  "someclass">Sommige tekst</div>"), "&lt;div class =&quot;someclass&quot;&gt;Sommige tekst&lt;/div&gt;", "Meer complexe test string.");
        });

        module("getDateAsCaml");
        test("QuizUtil getDateAsCaml()", functie () {
            gelijke(getDateAsCaml(Nieuw Datum("12/31/2013")), "2013-12-31T:00:00:00", "Testing hard gecodeerde datum: [12/31/2013]");
            gelijke(getDateAsCaml(Nieuw Datum("01/05/2014")), "2014-01-05T:00:00:00", "Testing hard gecodeerde datum: [01/05/2014]");
            gelijke(getDateAsCaml(Nieuw Datum("01/31/2014")), "2014-01-31T:00:00:00", "Testing hard gecodeerde datum: [01/31/2014]");
            gelijke(getTodayAsCaml(), getDateAsCaml(Nieuw Datum()), "getTodayAsCaml() moet gelijk zijn aan getDateAsCaml(nieuwe datum())");
            gelijke(getDateAsCaml("onzin waarde"), undefined, "Proberen om de datum van de waarde van een onzin.");
            gelijke(getDateAsCaml(undefined), undefined, "Probeer om de datum van de [undefined] datum.");
        });

        module("getParameterByName");
        test("QuizUtil getParameterByName (uit de querytekenreeks)", functie () {
            gelijke(getParameterByName(undefined), undefined, "Proberen om te krijgen niet-gedefinieerde parameter ongedefinieerde moet retourneren.");
            gelijke(getParameterByName("does not exist"), undefined, "Proberen om de waarde van de parameter wanneer we weten dat de parameter niet bestaat.");

        });

        module("Cookies");
        test("QuizUtil verschillende cookie functies.", functie () {
            gelijke(setCookie("test", "1", -1), getCookieValue("test"), "Get een cookie ik ingesteld zou moeten werken.");
            gelijke(setCookie("anycookie", "1", -1), True, "Instellen van een geldig koken moet retourneren 'true'.");
            gelijke(setCookie("gekke cookienaam !@#$%"%\^&*(()?/><.,", "1", -1), True, "Instellen van een slechte cookienaam moet retourneren 'valse'.");
            gelijke(setCookie(undefined, "1", -1), undefined, "Passing ongedefinieerde als de cookienaam.");
            gelijke(getCookieValue("does not exist"), "", "Cookie does not exist test.");
        });

    </script>
</hoofd>
<lichaam>
    <div id"qunit ="></div>
    <div id= "qunit-armatuur"></div>

</lichaam>
</HTML>

Er zijn verschillende dingen gebeuren hier:

  1. Verwijzen naar mijn code (QuizUtil.js)
  2. Verwijzen naar Qunity.js
  3. Sommige modules definiƫren (getIDFromLookup, Cookies, en anderen)
  4. Plaatsen van een <div> waarvan de ID is "qunit".

Vervolgens, Ik trek alleen deze pagina en krijg je zoiets als dit:

image

Figuur 3

Als je aan de bovenkant kijkt, u hebt een paar opties, waarvan er twee zijn interessant:

  • Verbergen voorbij tests: Vrij duidelijk.  Kan helpen uw oog gewoon zien de probleemgebieden en niet een heleboel rommel.
  • Module: (drop-down): Dit zal de tests tot alleen die groepen van tests die u wilt filteren.

Wat betreft de tests zelf-een paar opmerkingen:

  • Het spreekt vanzelf dat you need to Schrijf uw code zodanig zijn dat het in de eerste plaats testbare is.  Met behulp van het hulpprogramma kunt afdwingen die discipline. Bijvoorbeeld, Ik had een functie genaamd "getTodayAsCaml()ā€.  Dit is niet zeer testbare aangezien het geen invoer argument neemt en testen voor gelijkheid, We zouden moeten voortdurend actualiseren van de test-code om te reflecteren op de huidige datum.  Ik refactored het door een invoerparameter gegevens toevoegen dan langs de huidige datum wanneer ik wil de datum van vandaag in CAML formaat.
  • Het Qunit kader documenten zijn eigen proeven en het lijkt vrij robuust.  Het kan doen eenvoudige dingen zoals testen voor gelijkheid en heeft ook ondersteuning voor ajax stijl oproepen (zowel de "echte" of de mocked met behulp van uw favoriete mocker).
  • Gaan door het proces ook dwingt je om na te denken door middel van randgevallen ā€“ wat er gebeurt met "undefined" of null wordt doorgegeven aan een functie.  Het maakt het doodsimpel om te testen deze scenario's uit.  Goed spul.

Dekking met Blanket.js

Blanket.js is een aanvulling op Qunit door het bijhouden van de werkelijke lijnen van code die in de loop van het runnen van uw tests worden uitgevoerd.  Het integreert dus zelfs al is het een hele aparte app recht in Qunit, het speelt mooi-het echt lijkt alsof het is een naadloze app.

Dit is blanket.js in actie:

image Figuur 4

image

Figuur 5

(Je eigenlijk hebben om te klikken op het selectievakje "Enable dekking" aan de bovenkant [Zie figuur 3] om dit mogelijk te maken.)

De gemarkeerde regels in figuur 5 niet zijn uitgevoerd door een van mijn tests, dus ik moet ontwikkelen een test die leidt hen om uit te voeren tot als ik wil volledige dekking.

Krijgen blanket.js werken door deze stappen te volgen:

  1. Het downloaden van http://blanketjs.org/.
  2. Toe te voegen aan uw project
  3. Bijwerken van uw testpagina harnas (QuizUtil_test.html in mijn geval) als volgt:
    1. Verwijst naar de code
    2. Versier uw <script> verwijst naar uitzien:
    <script type= text/javascript"" src="QuizUtil.js" gegevens-cover></script>

Blanket.js pikt het kenmerk "gegevens-cover" en doet zijn magie.  Het haken in Qunit, bijgewerkt de UI als u wilt toevoegen de optie "Enable dekking" en voila!

Samenvatting (TL; DR)

Gebruik Qunit om te schrijven uw testcases.

  • Downloaden
  • Toe te voegen aan uw project
  • Schrijf een testpagina harnas
  • Maak uw tests
    • Sommige van uw code testbare refactoring
    • Wees creatief!  Denk aan gek, onmogelijk scenario's en test hen toch.

Gebruik blanket.js om dekking

  • Zorg ervoor dat Qunit werkt
  • Blanket.js downloaden en toevoegen aan uw project
  • Toe te voegen aan uw harnas testpagina:
    • Voeg een verwijzing toe naar blanket.js
    • Voeg een "gegevens-cover" kenmerk toe aan uw <script> Label
  • Uw Qunit tests uitvoeren.

Ik nooit heb een van deze vĆ³Ć³r en had sommige rudimentaire dingen werken in een handvol uur. 

Gelukkig testen!

</einde>

undefinedAbonneren op mijn blog.

Volg mij op Twitter op http://www.twitter.com/pagalvin

Het laatste pak dat je ooit zult dragen?

[Snelle Opmerking-Dit is een vrij lange post op een vacature voor mijn fractie hier in New York en hoeft u om te leven in de tri-state gebied als je geĆÆnteresseerd bent.]

Ik toegetreden Slalom raadpleging over 18 maanden geleden en dat maakt dit mijn langste duurzame baan sinds 2007. Ik ben niet van plan het op die manier. Voorafgaand aan een reeks van baan hoppen die begon met mijn sprong in de SharePoint-wereld, Ik was op Ć©Ć©n plaats voor elf jaar. Ik heb eindelijk een nieuwe, blijvende plek om te werken voor de lange termijn hier bij Slalom.

Deze plaats groeit en ik wil graag om te controleren of. Het soort hulp die ik nodig wordt meestal aangeduid met een "SharePoint Solutions Architect" Hoewel ik heb gevonden het woord architect worden meer dan en/of onjuist in de SharePoint-ruimte voor vrij een tijdje nu gebruikt. I been struggling over hoe om te bloggen over dit. Ik wil niet gewoon uit een bos van opsommingstekens in dobbelstenen/Monster stijl lijst. Mijn uitstekende werven collega's hebben dat al gedaan :). Dus, Heb ik besloten om een "day in the life"-aanpak. Lees het en overwegen:

1) Als het een beroep doet en

2) Of u weet in je botten dat je kunt doen.

Zo ja, contact met mij opnemen (Paul.Galvin@slalom.com) en laten we praten.

Dit zijn wat u kunt verwachten te doen in typische week/maand als een architect oplossingen op mijn team:

  • Uitvoeren van projecten, vaak meer dan Ć©Ć©n filter tegelijk. Sommige projecten zijn groot en dus zou je eigen dat een project. "Running" een project betekent dat u toezicht en verantwoordelijkheid voor de algehele kwaliteit van de levering. In bijna alle gevallen heb je een PM en een echt sterk team van ontwikkelaars, BAs, UX mensen, enz., om u te ondersteunen. Maar u zult de belangrijkste gezicht de client ziet, vertrouwensrelaties, etc. Er is geen verbergen in de schaduwen in deze rol :). Je zult dit keer factuur en het doel is om u te druk genoeg om dit te doen 80 procent van de tijd.
  • Helpen met papierwerk ā€“ zeugen, Offerteaanvragen, dekken-al dat goede materiaal. Ik denk dat we ons proces SOW vrij strak en solide dus het is vrij formulaire. Als je gewend bent aan het schrijven van zeugen vandaag, ons proces is niet van plan te zijn een uitdaging voor u. Inkoopproces ā€“ dit zijn een beetje moeilijker. Ze hebben de neiging te worden op maat in de natuur om te beginnen met en inkoopproces Trek meestal in meerdere verschillende auteurs. Het is zowel goed als slecht, maar vooral goed. Dit kan scrambly krijgen wanneer wij de noodzaak van uitstekende klantenservice moeten terwijl het ook proberen om te winnen van nieuw werk jongleren. U waarschijnlijk zal niet zelf een RFP maar u zal worden gevraagd om bij te dragen secties.
  • Verkoopgesprekken, maar niet een dichter. In de loop van een maand, u kunt verwachten om te gaan op een paar van de verkoopgesprekken met ons sales team. U zult de KMO in de kamer, notities maken en helpen vorm van de oplossing. Echter, u zal niet worden gevraagd of verwacht om de verkoopcyclus van start tot finish. U hoeft niet te 'verkopen,"je hoeft alleen te worden van de rustige stem van de deskundige rede in de kamer. Dit bouwt vertrouwen en vertrouwen en dat is waarom je er. Natuurlijk, Als je de verkoop van, dan is er ruimte voor u om te groeien ook hier.
  • Helpen met het werven van. We hebben een soort van referral programma, Dus als je echt weet sterke mensen in de Gemeenschap waarvan u denkt dat moet deel uitmaken van Slalom, u profiteert op die manier. Wij zijn speciaal bestemd voor recruiters (Wie zijn uitstekende) het leeuwendeel van dit soort werk doen. De echte hulp is interviewen kandidaten-zijn ze een goede pasvorm cultureel? Weten ze hun spullen? Kunnen ze maken * mijn * leven makkelijker? šŸ™‚ This comes in spurts, een paar keer per maand, Hoewel in sommige maanden u niet het op alle doen zou.
  • Helpen bepalen van beste praktijken, opbouwen van onze IP en ons in de markt concurrerender te maken. U bent een ervaren guy/gal. U bent geweest rond het blok-niet alleen in SharePoint, maar u hebt ervaring in andere technologieĆ«n en meegemaakt van goede en slechte (zelfs verschrikkelijke) projecten overal. Als een resultaat, u weet wat werkt en wat niet. Willen wij u die ervaring met ons te delen op basis van dag tot dag in een tactische zin (dwz. echt goed uitvoeren van uw projecten) maar ook strategisch. 'Best practices' is een beetje veel gebruikt als een term en ik aarzel om het te gebruiken. Het basisidee is dat je als een ervaren persoon met een diepe en relevante ervaring komt en we het beste van uw lessen integreren willen in hoe we aangaan met klanten op basis van dag tot dag.
  • Veel plezier -Wij zijn een zeer geĆÆntegreerde bos. Ik wil nog een gemeenplaats voorkomen, maar het is in dit geval echt apt-we hard werken (soort van) en we spelen nog moeilijker :). Er is een soort van Aaron Sorkin van scherts hier, de kamer is altijd vol met knappe mensen, Wij houden van onze drank en we organiseren een groot aantal leuke evenementen-film van de nacht, Honkbal-reizen (zelfs als ze verschrikkelijk, praktisch kwaad teams).

Als ik kon som van allen in Ć©Ć©n woord, Ik zou gebruiken het woord "leiderschap". Projecten leiden, het voortouw neemt in gebouw uit de praktijk (IP, het opbouwen van het team), etc.

Maar wacht! Er is meer! Waarom anders werk bij Slalom?

  • Opmerkelijke eenheid van bedoeling-dat iedereen wil dit ding uit groeien. "Dit ding" is het kantoor in New York. Iedereen is aan boord met dit.
  • Wind in de zeilen-zus kantoren, zuster praktijken-Slalom is een "full service" consulting organisatie. Ik leiden de praktijk SharePoint (een "praktijk gebied leiden" in Slalom lingo). Ik heb zus praktijken op 11 andere kantoren Slalom. Dus ook al ik koning, voor zover ben SharePoint gaat hier in Slalom New York, Ik heb peer praktijken in Chicago, Seattle, Dallas, Atlanta, Boston, etc. waaruit kan ik putten uit de steun. Het is echt het beste van beide werelden-aanzienlijke autonomie hier in New York, maar toegang tot ton van talent binnen de organisatie.
  • Wind in uw verkoop (2) ā€“ Wij doen meer dan SharePoint-veel meer. We doen BI, CRM, UX, business consulting, Mobile, ontwikkeling op maat en anderen. Wij zijn goed op grensoverschrijdende verkopen onder ons en we goed schilderij- en nog belangrijker, leveren op ā€“ een "full service" afbeelding voor onze klanten. Dit is met name aantrekkelijk voor mij. Ik heb op veel kleinere orgs werken op SharePoint optredens en gefrustreerd over en weer omdat we waren duif doorboord als de "SharePoint mensen." Dat gebeurt niet met Slalom en we daardoor meer interessante werk doen.
  • Lokale model-geen reizen.
  • Groei op lange termijn-Slalom is al gangbusters. Veel van groei en stabiliteit. Groei betekent ook dat we huren leiders vandaag aan het hoofd van de nieuwe teams moeten aangezien wij meer klanten en medewerkers ter ondersteuning van deze clients toevoegen.

Ik kon gaan op, maar ik heb waarschijnlijk al te lang op. Ik denk dat ik heb gevangen de essentie hier. Als u denkt over veranderende banen en dit ziet er goed voor u, laten we praten.

Als u tevreden op uw huidige baan bent-let's talk hoe dan ook :). Ik heb in veel plaatsen en was "blij" op het moment. Slalom is anders en ik zou graag een kans om u daarvan te overtuigen.

</einde>

undefinedAbonneren op mijn blog.

Volg mij op Twitter op http://www.twitter.com/pagalvin

Snel en eenvoudig: Instellen van de grootte van een Items in een keuzelijst in een App Store voor Windows

In een Windows Store App ben ik het creĆ«ren van, Ik wil laten zien van de gebruiker verschillende informatieve berichten.  Ik pakte een ListBox als het instrument om te laten zien, zodat ze via hen en al dat goede materiaal schuiven kunnen. 

De berichten zijn alleen informatief, dus er is geen behoefte om al dat extra witruimte rond hen aangezien de gebruiker ze nooit voor om het even wat kunt selecteren.  Het standaardgedrag van de ListBox biedt een aanzienlijke hoeveelheid opvulling en ik wilde om zich te ontdoen van het.  Goed.... u kunt niet dat soort ding op de ListBox rechtstreeks.  ECHTER, u kunt dit doen op de items die u toevoegt:

        privƩ VOID AddGameStateLogMessage(tekenreeks theMessage)
        {
            TextBox t = Nieuw TextBox();
            t.Text = GameStateCounter    + ": " + theMessage;
            t.TextWrapping = TextWrapping.Wrap;
            t.MinWidth = 400;
            Dikte thisPadding = Nieuw Dikte(5, 0, 5, 0);
            t.Padding = thisPadding;
            t.FontSize = 12;

            ListBoxItem li = Nieuw ListBoxItem();
            Li.Inhoud = t;
            Li.MaxHeight = 25;
            thisPadding = Nieuw Dikte(5, 0, 5, 0);
            Li.Opvulling = thisPadding;

            GameStateLog.Items.Insert(0,Li);
        }

in het bovenstaande, Ik ben een tekstvak maken en instellen van het lettertype, de opvulling, etc.

Volgende, Ik maak een ListBoxItem en stel de inhoud op de opgemaakte TextBox.

Tot slot, Ik invoegen de ListBoxItem in de ListBox.  (Ik wil laten zien van de meest recente berichten op de top van de lijst, Vandaar de invoegen(0,Li) in plaats van een eenvoudige toevoegen() inroepen.).

Ik zal worden tweaken dit een beetje voordat ik echt blij met de ListBox gedrag ben maar het patroon hierboven is zeer vruchtbaar geweest.  Hopelijk vindt iemand anders het nuttig.

</einde>

undefinedAbonneren op mijn blog.

Volg mij op Twitter op http://www.twitter.com/pagalvin