Cum pentru a specifica oamenilor ca un domeniu de căutare / Sursă de conţinut utilizând SharePoint 2013 RESTUL API

Am avut un motiv pentru a lucra cu SharePoint 2013 API de căutare prin intermediul restul pentru prima dată. Am vrut pentru a căuta oameni, nu documente. Cheia aici este că de învăţare specificate sursele de conținut prin intermediul GUID sale (sau cel puţin în acest caz). JQuery următorul fragment Arată cum:

    loadExpertsAsync: funcţia() {

        jQuery.support.cors = adevărat;

        $.Ajax({
            URL-ul: Acest lucru.CreateFullApiUrl() +
                "?querytext = "portaluri"&IDSursă = "b09a7990-05ea-4af9-81ef-edfab16c4e31"" +
                "&selectproperties ='LinkedInProfileUrl,GoogleCirclesProfileUrl,BALargeProfilePictureUrls,BAGridPictures,WorkEmail,Abilităţi,AboutMe,Interesele,Funcţie,PastProjects,PictureURL,PreferredName,TwitterHandle,LinkedInProfileUrl,PreferredName,GoogleCirclesProfileUrl'" +
                "&RowLimit = 99",
            metoda: "OBŢINE",
            anteturi: { "Accepta": "cerere/json; Odata = verbose" },
            cache-ul: fals,
            succesul: funcţia (rezultatul) {

În cazul meu, I sînt running API împotriva SharePoint online. Pentru a obţine GUID-ul, Am urmat pasii:

  1. Accesaţi centrul de administrare SharePoint
  2. Selectează "căutare" din stânga mâna de navigare
  3. Selectaţi "gestionare rezultatul surse"
  4. Selectaţi "Localnicii rezultate"
  5. Uita-te la URL-ul.

URL-ul meu arata ceva de genul:

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

Parametrul IDSursă este ceea ce a lucrat pentru mine.

(Am înţeles că IDSursă poate fi de fapt un fel de lucru permanente cu SP, but I’ll always check anyway 🙂 ).

</scop>

undefinedAboneaza-te la blog-ul meu.

Urmaţi-mă pe Twitter, la http://www.twitter.com/pagalvin

Exemplu SharePoint restul apeluri

Aici este un set de probă restul apeluri care funcţionează pentru mine şi vă poate ajuta, de asemenea. Ca de 02/2014, there are two examples 🙂

  1. O coloană cu spaţii în numele de referinţă
  2. Referinţă o coloană de selecție multiplă
  3. Efectuaţi o căutare de oameni prin intermediul restul

 

Voi adăuga la acest lucru ca timpul trece.

Aici sunt unele cerneluri utile am găsit, de asemenea:

O coloană cu spaţii în numele de referinţă

Pot crea o listă personalizată cu o coloană numită "Blog-ul autorului" (spaţiu între Blog şi autorul).

$select această coloană de referinţă este:

image

Pur şi simplu înlocuiţi spaţiul cu "_x0020_". Vom vedea _x0020_ în multe exemple în întreaga Internet şi restul nu este diferit.

Dacă nu faci asta, sunteţi răspunzător pentru a obţine un mesaj de eroare de genul asta:

Expresia “Blog-ul autorului” nu este valid.

Destul de uşor.

Referinţă o coloană de căutare selecție multiplă

Înfiinţat:

  1. Crea o listă personalizată numit categorii.
  2. Adauga unele categorii. Am adăugat categorii astfel:image
  3. Creaţi o altă listă particularizată numit MockBlog şi adăugaţi categorii ca o coloană multi-lista selecta (sau coloană de site în cazul în care este modul în care aţi rola).

Adăuga unele elemente la lista de Mockblog şi sunteţi gata.

Un apel de stil Ajax, utilizarea jQuery va arata ceva de genul:

serverUrl  = "/_api/web/liste/GetByTitle('MockBlog')/elemente" +
             "?$Selectaţi = titlu,Categorii/titlu,Blog_x0020_Author/titlu" + 
             "&$Expand = Blog_x0020_Author,Categorii";

Noi suntem spune SharePoint "da-mi titlul pentru toate categoriile (Categorii/titlu). Valorile reale pentru a lua Titlul de $extindeING lista categoriilor." (Meu parafrazând odihnitor este, probabil, destul de lejer, dar cum eu sunt interpretarea acestora).

Dacă aţi face acest lucru prin intermediul JavaScript şi utilizarea Lăutar să se uite la ieşire, veţi obţine ceva de genul asta în schimb:

 

image

(De mai sus este un obiect JSON)

Efectuaţi o căutare de oameni prin intermediul restul

I blogged despre acest separat. Cheia este de a specifica un parametru de IDSursă a căror valoare este GUID-ul de sursa de conținut Local de persoane. (Sursele de conținut folosit pentru a fi numit domenii şi my-oh-mea nu atât de greu pentru a apela tot ceea ce un domeniu de aplicare pentru mine!).

Citeşte mai multe despre el aici: http://www.mstechblogs.com/paul/?p=10385

 

</scop>

undefinedAboneaza-te la blog-ul meu.

Urmaţi-mă pe Twitter, la http://www.twitter.com/pagalvin

Rapid şi uşor: Creaţi un sit SharePoint, utilizând restul

Există o mulţime de resurse în jurul care arată cum să facă acest lucru, dar nu am putut găsi o cuprinzătoare-a merge link-ul, Deci, aici suntem.

Puteţi crea un sit SharePoint, utilizând API restul.  Aici este un exemplu complet coapte:

<!--
    SiteRequestForm.html: Colecta informaţii şi de a crea un site pentru utilizator.
-->

<Centrul>
<tabel>
    <TR>
        <TD>Numele site-ului:</TD>
        <TD><intrare tip= "text" nume= "SiteName" ID-ul= "SiteName" /></TD>
    </TR>
    <TR>
        <TD ColSpan= "2">
            <intrare tip= "submit" ID-ul= "CreateSiteButton" valoarea= "Creaţi site-ul" />
        </TD>
    </TR>
</tabel>
</Centrul>

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

<script-ul>
var CreateSiteLogicContainer = {

    createSiteData: {
            "parametrii": {
                __metadata: { "tip de": "SP.WebInfoCreationInformation" },
                URL-ul: "Paultest1",
                Titlul: "Paultest1",
                Descriere: "creat de restul web de Paul!",
                Limba: 1033,
                WebTemplate: "sts",
                UseUniquePermissions: fals
            }
    },

    createSite: funcţia () {

        jQuery.support.cors = adevărat;

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

            anteturi: {
                "Accept": "cerere/json; Odata = verbose",
                "content-type": "cerere/json;Odata = verbose",
                "X-RequestDigest": $("#__REQUESTDIGEST").vasilica()
            },

            date: JSON.stringify(CreateSiteLogicContainer.createSiteData),

            succesul: funcţia () { alertă("succesul"); },
            eroare: funcţia () { alertă("eroare"); }

        });
    },

    wireUpForm: funcţia () {
        $("#CreateSiteButton").faceţi clic pe(funcţia () {
            alertă("Cale de a încerca şi de a crea site-ul.");
            CreateSiteLogicContainer.createSite();
        });
    }


}

CreateSiteLogicContainer.wireUpForm();

</script-ul>

Când de succes, tu a lua un pachet de JSON în răspuns ca aceasta:

image

Cheie gândurile mele şi cunoştinţele din acest includ:

  • Această abordare foloseste jQuery.  În cazul meu, mea bibliotecă jQuery este situat în ".../ plugin-uri. "  Veţi dori să schimbe că la punctul de la locaţia dumneavoastră preferat de JQ.
  • Puteţi copia şi lipi acest fragment întreg într-o parte de Editor de conţinut Web pe o pagină, şi ar trebui să funcţioneze bine.  Veţi dori să schimba punctul final al API apel şi asiguraţi-vă de referinţă JQ corect.
  • URL-ul este relativ API dumneavoastră final.  În cazul meu, este crearea sub-site-uri sub https://bigapplesharepoint.com
  • Nu aveţi nevoie pentru a oferi un conţinut de lungime. Unele posturi blog-ul şi MSDN documentul implică faptul că faci, dar sa întâmplat pentru mine automat, care presupun este gestionate de $.ajax apel în sine.
  • Această linie este necesară pentru a evita un răspuns "interzis": "X-RequestDigest": $("#__REQUESTDIGEST").vasilica().  Există alte moduri de a face acest lucru, dar acest lucru este destul de frumos.  Am pierdut link-ul la blog-ul care a furnizat această comandă rapidă.  H/T la tine, misterios blogger!

Mult noroc şi sper că acest lucru ajută pe cineva.

</scop>

undefinedAboneaza-te la blog-ul meu.

Urmaţi-mă pe Twitter, la http://www.twitter.com/pagalvin

Depăşi enervant problemă cu URL-uri Relative în Lansarea rapidă SharePoint

Am vrut să adăugaţi un link la lansare rapidă de navigare altă zi şi mi-a spus SharePoint:

image

Versiune text curat de care este:

Asigura că URL-ul este valabil şi începe fie cu un caracter valid (un semn de număr (#) sau bară oblică (/)) sau un protocol valabile acceptate (de exemplu, "http://’, "https://’, "fişier://’, "ftp://’, "mailto:’, ' Ştiri:’).

"Blech şi variola!"Am spus.

Un workaround la acest lucru este de a folosi JavaScript pentru a găsi un link cunoscută în Lansarea rapidă şi de a trece peste comportamentul acestuia.

Pentru a testa acest lucru, Adauga un nou link la site-ul de testare thusly:

image

Am folosit jQuery. La spre solve it, obţine unele JavaScript şi jQuery pe pagina folosind tehnica ta preferată şi cu o linie de cod ca asta:

 

$(document).gata( funcţia () {

    $("o:conţine("Test URL-ul de înlocuire")").faceţi clic pe(funcţia () { alertă("faceţi clic pe schimbat comportamentul!"); reveni fals;});

});

Şi Bob pe unchiul tău.

JQuery selectorul găseşte fiecare <o> Tag-ul care a "Test URL-ul de înlocuire" în numele său. Poate doriţi să găsiţi-ton, care în funcţie de legătura şi astfel.

.click(funcţia() suprascrie orice SharePoint ar fi făcut atunci când utilizatorul face clic pe. Asiguraţi-vă că vă "întoarce false" sau altceva va face lucrurile tale şi apoi încercaţi să href lucru prea, care nu este aproape cu siguranţă scopul tau.

Acest lucru a fost făcut şi testare într-un mediu online SharePoint dar ar trebui să lucreze bine în 2010 şi mai devreme prea.

</scop>

undefinedAboneaza-te la blog-ul meu.

Urmaţi-mă pe Twitter, la http://www.twitter.com/pagalvin

Simplă şi rapidă: SharePoint restul apela numai revine 100 Înregistrări

Am fost de lucru pe un site public cu care se confruntă pentru practica mea de SharePoint aici în New York şi se foloseşte o mulţime de JavaScript şi restul apeluri pentru a afişa conţinut.

În timpul dezvoltării magistrala, Creează un set de date mici, cu doar 10 sau aşa rânduri dintr-o listă particularizată şi apelurile mele restul toate trase de acolo.  O dată am întâlnit lista pentru a avea câteva sute de rânduri de date pentru a testa pentru creşterea anticipată, Am constatat că am fost obtinerea exact 100 rânduri s-a întors înapoi pe apelurile mele de restul.

Acesta este un lucru foarte simplu la adresa.  În cazul meu (şi cred că în majoritatea cazurilor), implicit restul numeşte SharePoint (şi, eventual, ca un standard în industrie?) reveni 100 rânduri.  Pentru a reveni mai mult implicit, utilizaţi parametrul $top apel, ca şi în:

IA /Insights Dev/_api/web/lists/GetByTitle('MockBlog')/elemente?$Selectaţi = ID,Titlul,Categorii/titlu,Blog_x0020_Author/titlu,DatePublished,BlogSummary&$Expand = Blog_x0020_Author,Categorii&$filtru =&$sus = 9999

Am luat 9999 în acest caz, deoarece ştiu că growth-wise, acolo nu va fi mai mult 200 sau astfel încât rândurile adăugate la această listă într-un an.  În cazul în care acesta devine dizgraţios, putem implementa unele paginare în jos pe drum.

</scop>

undefinedAboneaza-te la blog-ul meu.

Urmaţi-mă pe Twitter, la http://www.twitter.com/pagalvin

Simplă şi rapidă: Rezolva "parametru Invalid URL” problema cu UpdateListItems în lists.asmx

Atunci când se lucrează cu UpdateListItems prin intermediul lists.asmx, este uşor pentru a genera eroare:

Parametru invalid URL.

URL-ul furnizat conține o comandă invalidă sau valoare. Vă rugăm să verificaţi URL-ul din nou.

Puteţi obţine această eroare atunci când aţi uitat să includă ID din lista de câmpuri pentru a actualiza.  Acest lucru, ca o mulţime de aceste SP servicii web, este un pic contraintuitiv, deoarece trebuie să includă ID-ul în atributul ID <Metoda> element.  Si nu esti actualizat ID şi, probabil, vrea să niciodată în primul rând.

Acest plic de săpun funcţionează:

<soapenv:Plic xmlns:soapenv ="http://schemas.xmlsoap.org/SOAP/Envelope/'>
  <soapenv:Organism>                      
    <UpdateListItems xmlns ="http://schemas.Microsoft.com/SharePoint/SOAP/'>                     
      <listName>{C712E2EA-54E1-47AD-9D99-1848C7773E2F}</listName>                     
        <actualizări>                     
         <Lot LaEroare ="Continua">
          <Metoda ID ="1" Cmd ="Update">
            <Numele de câmp ="CooperativeLock">blocat!</Câmp>
            <Numele de câmp ="ID">1</Câmp>
          </Metoda>
        </Lot>                     
        </actualizări>                
      </UpdateListItems>             
  </soapenv:Organism>         
</soapenv:Plic>

Dacă benzi afară ID câmp referinţă apoi veţi primi mesajul "Parametru Invalid URL" enervant.

</scop>

undefinedAboneaza-te la blog-ul meu.

Urmaţi-mă pe Twitter, la http://www.twitter.com/pagalvin

 

Bietul om pe cache în JavaScript

[TL;DR versiune: utilizează module cookie pentru a stoca rezultatele apeluri async; face rezultatele de ultimele apeluri async imediat şi apoi le valida după pagină de încărcare.]

Am fost de lucru pe site-ul SharePoint intranet pentru un client care dispune de, Printre alte lucruri, o navigare secundara stilizate ale căror opţiuni de meniu sunt gestionate prin intermediul o listă particularizată vechi regulate.  Ideea este că clientul ajunge la site-ul "lor" meniu de control fără a afecta sau afectat de navigaţie globală pus de acesta.

(este ceva incredibil subversiv despre adăugarea unui CEWP care indică spre un fişier HTML care încarcă unele CSS şi JS pentru a modifica fundamental aproape totul despre comportamentul unui site... dar asta e pentru un alt post)

Codul pentru acest destul de simplu:

Inflamat la faţa locului aici este că de fiecare dată când cineva loveşte una din paginile site-ului, browser de web care utilizatorul este ajungând pentru a obţine elemente din listă.  Odată ce dev este completă şi testare a dovedit lucruri pentru a fi stabil şi complete, acest apel este necesar mai mult 99% de timp din meniul rareori modificări.  De asemenea, are un efect ciudat UI, care este comună în această lume nouă curajos de hiper-ajaxy site-uri web-pagina face şi abia apoi meniul render.  Este de nervozitate şi distrag atenţia, în opinia mea.  Şi nervozitate. Deci, cache-ul. 

Am modificat logica thusly:

  • Uita-te pentru un cookie în browser-ul care conţine meniul, am citit-o ultima
    • Dacă a întemeia, face imediat.  Nu aşteptaţi pentru ca pagina să termin de încărcare.  (Aveţi nevoie să vă asiguraţi că codul HTML este plasat strategic aici, dar nu este greu pentru a face).
  • Aşteptaţi pentru ca pagina să termin de încărcare şi să facă o asincron apel pentru a încărca până elementele de meniu dintr-o listă utilizând restul sau lists.asmx sau orice altceva
  • Compara ceea ce am primit împotriva cookie
    • Dacă se potriveşte, opreşte-te
    • În caz contrar, folosind jQuery, dinamic popula o grămadă, dacă <li>pe într-o <ul>
  • Utiliza CSS pentru a face toate formatările
  • Profit!

Unii dintre voi sunt de gând să spun, "Hei! nu există nici o reală în cache întâmplă aici deoarece sunteţi de lectură meniul oricum fiecare dată.”  Si ai dreptate-nu sunt oferindu-server nici un fel de pauza.  Dar pentru că apelul este asincron şi se întâmplă după ce pagina iniţială HTML payload face complet, se "simte" mai receptiv la utilizator.  Meniul redă destul de mult ca pagina atrage.  Dacă meniul se intampla la schimbare, utilizatorul este supus la o nervozitate re-trage din meniul, dar numai ca o singură dată.

Există câteva modalităţi de a face acest cache-ul mai eficientă şi de a ajuta server în acelaşi timp:

  • Pune într-o regulă că cache-ul"cookie" este valabil pentru un minim de 24 ore sau unele alt interval de timp. Atâta timp cât nu există nici un cookie-ul expirat, utilizează modulul cookie meniu instantaneu şi niciodată nu a lovit server.

Ei bine... asta e tot ce vin in minte acum :). 

Dacă cineva are vreo idee inteligent aici mi-ar plăcea să le cunoască.

Şi în fine – aceasta tehnica poate fi folosit pentru alte chestii.  Acest client are o serie de lucruri bazate pe date despre diverse pagini, mulţi dintre ei schimbare relativ rar (ca o dată pe săptămână sau o dată pe lună).  Dacă vizaţi domenii specifice de funcţionalitate, puteţi da o mai receptiv UI trăgând conţinut la magazinul local cookie şi redare imediat.  Se simte mai repede utilizatorului, chiar dacă nu salvaţi server orice cicluri.  Tu poate salvaţi în cicluri de server de decide cu privire la unele condiţii şi declanşează pentru a anula acest cache-ul local cookie.  Care este toate situaţionale şi artsy chestii şi într-adevăr cel mai distractiv :). 

</scop>

undefinedAboneaza-te la blog-ul meu.

Urmaţi-mă pe Twitter, la http://www.twitter.com/pagalvin

cum să: Configuraţi unitatea de testare şi încercare de acoperire cu QUnit.js şi Blanket.js pentru oficiu 365 SharePoint App

Intro

I-am fost explorarea unitate de testare şi test de acoperire pentru JavaScript ca am de lucru pe un nou app SharePoint pentru SharePoint online la birou 365 Suită.  Direcţii de cercetare evidente a condus-mi Qunit.js şi chiar după aceea, pentru a Blanket.js.

QUnit să-mi configura unitatea de teste şi grupaţi-le în module.  Un modul este doar un mod simplu de a organiza teste conexe. (Eu nu sunt sigur că eu sunt, folosind ca destinate, dar este de lucru pentru mine până acum cu mic set de teste am definit-o până acum).

Blanket.js se integrează cu Qunit şi mă va arăta liniile reale de JavaScript care au fost – și mai important – au fost nu fapt executate în teste.  Acest lucru este "acoperire"-linii care execută sunt acoperite de încercare, în timp ce altele nu sunt.

Între crearea bun cazuri de testare şi vizualizarea de acoperire, putem reduce riscul că codul nostru a ascuns defecte.  Vremuri bune.

Qunit

Presupunând că aveţi dumneavoastră Visual Studio proiect înfiinţat, începe prin a descărca pachetul JavaScript la http://qunitjs.com.  Adauga JavaScript şi corespondente CSS la solutia ta.  A mea arata ca acest lucru:

image

Figura 1

După cum puteţi vedea, Am fost folosind 1.13.0 în timp am scris acest blog post. Nu uitaţi să descărcaţi şi să adăugaţi fişierul CSS.

Că din modul în care, Următorul pas este de a crea un fel de test de harnaşament şi biţi Qunit de referinţă.  Eu sunt de testare o grămadă de funcţii într-un fişier script denumit "QuizUtil.js", asa ca am creat o pagina HTML numită "QuizUtil_test.html", aşa cum se Arată:

image Figura 2

Aici este codul:

<!DOCTYPE HTML>
<HTML xmlns= "http://www.w3.org/ 1999/xhtml">
<cap>
    <titlul>Test de QuizUtil cu Qunit</titlul>
    <link-ul rel= "foaia de stil" href="../CSS/qunit-1.13.0.CSS" />
    <script-ul tip= text/javascript"" src="QuizUtil.js" date-acoperi></script-ul>
    <script-ul de tip ="text/javascript" src ="qunit-1.13.0.js"></script-ul>
    <script-ul de tip ="text/javascript" src ="blanket.min.js"></script-ul>

    <script-ul>
        Modulul("getIDFromLookup");
        test("QuizUtil getIDFromLookupField", funcţia () {
            var goodValue = "1;#Paul Galvin";

            egal(getIDFromLookupField(goodValue) + 1, 2), "ID-ul de [" + goodValue + "] + 1 ar trebui să fie 2";
            egal(getIDFromLookupField(nedefinit), nedefinit, "Argumentul intrare nedefinit ar trebui să reveni nedefinit rezultatul.");
            egal(getIDFromLookupField(""), nedefinit, "Argumentul intrare gol trebuie să revină o valoare nedefinit.");
            egal(getIDFromLookupField("gobbledigood3-thq;dkvn ada;skfja sdjfbvubvqrubqer0873407t534piutheqw;vn"), nedefinit,"Ar trebui să întotdeauna întoarce o decapotabilă rezultatul la un întreg");
            egal(getIDFromLookupField("2;#unei alte persoane"), "2", "Verificarea [2;#unei alte persoane].");
            egal(getIDFromLookupField("9834524;#valoare lung"), "9834524", "Test de mare valoare.");
            notEqual(getIDFromLookupField("5;#oricine", 6), 6, "O notEqual de testare (5 nu este egal cu 6 pentru acest eşantion: [5;#oricine]");

        });

        Modulul("htmlEscape");
        test("QuizUtil htmlEscape()", funcţia () {
            egal(htmlEscape("<"), "&lt;", "Evadarea la mai puţin de operator ('<')");
            egal(htmlEscape("<clasa div =  "someclass">Un text</div>"), "&lt;clasa div =&quot;someClass&quot;&gt;Un text&lt;/div&gt;", "Şir de testare mai complexe.");
        });

        Modulul("getDateAsCaml");
        test("QuizUtil getDateAsCaml()", funcţia () {
            egal(getDateAsCaml(noi Data("12/31/2013")), "2013-12-31T:00:00:00", "Testarea greu codificate data: [12/31/2013]");
            egal(getDateAsCaml(noi Data("01/05/2014")), "2014-01-05T:00:00:00", "Testarea greu codificate data: [01/05/2014]");
            egal(getDateAsCaml(noi Data("01/31/2014")), "2014-01-31T:00:00:00", "Testarea greu codificate data: [01/31/2014]");
            egal(getTodayAsCaml(), getDateAsCaml(noi Data()), "getTodayAsCaml() ar trebui să egal getDateAsCaml(Noua dată())");
            egal(getDateAsCaml("valoare de prostii"), nedefinit, "Încercaţi să obţineţi la data de o valoare de prostii.");
            egal(getDateAsCaml(nedefinit), nedefinit, "Încercaţi să obţineţi la data de [nedefinit] data.");
        });

        Modulul("getParameterByName");
        test("QuizUtil getParameterByName (din şirul de interogare)", funcţia () {
            egal(getParameterByName(nedefinit), nedefinit, "Încercaţi să obţineţi nedefinit parametru ar trebui să reveni nedefinit.");
            egal(getParameterByName("nu există"), nedefinit, "Încercaţi să obţineţi valoarea parametrului atunci când ştim că parametrul nu exista.");

        });

        Modulul("Cookies");
        test("QuizUtil diverse funcţii de cookie-ul.", funcţia () {
            egal(setCookie("test", "1", -1), getCookieValue("test"), "Ia un cookie seta ar trebui să funcţioneze.");
            egal(setCookie("anycookie", "1", -1), adevărat, "Setarea un gătit valabil trebuie să revină"adevărat".");
            egal(setCookie(numele de "cookie" nebun" !@#$%"%\^&*(()?/><.,", "1", -1), adevărat, "Setarea un nume de rău cookie ar trebui să reveni"falsă".");
            egal(setCookie(nedefinit, "1", -1), nedefinit, "Trecerea nedefinit ca numele cookie-ul.");
            egal(getCookieValue("nu există"), "", "Cookie nu exista test.");
        });

    </script-ul>
</cap>
<corpul>
    <div ID-ul= "qunit"></div>
    <div ID-ul= "qunit de fixare"></div>

</corpul>
</HTML>

Există mai multe lucruri se întâmplă aici:

  1. Codul meu de referinţă (QuizUtil.js)
  2. Corelarea Qunity.js
  3. Definirea unor module (getIDFromLookup, Cookie-urile, şi altele)
  4. Introducerea unei <div> ale căror ID-ul este "qunit".

Apoi, I trage doar această pagină şi veţi obţine ceva de genul asta:

image

Figura 3

Dacă te uiţi în partea de sus, aveţi câteva opţiuni, dintre care două sunt interesante:

  • Ascundere a trecut testele: Destul de evident.  Poate ajuta ochi doar vedea zonele de problemă şi nu o mulţime de dezordine.
  • Modulul: (drop jos): Acest lucru va filtra testele la doar acele grupuri de teste care doriţi.

Pentru testele de sine-câteva Comentarii:

  • Se subînţelege că aveţi nevoie pentru a scrie cod, astfel încât să fie testabile în primul rând.  Utilizând instrumentul poate ajuta pună în aplicare această disciplină. De exemplu, Am avut o funcţie numită "getTodayAsCaml()”.  Acest lucru nu este foarte testabile, deoarece este nevoie de nici un argument de intrare şi să testaţi-l pentru egalitatea de şanse, noi ar trebui să în mod constant actualizare codul de test pentru a reflecta data curentă.  L-am refactored prin adăugarea un parametru de intrare de date, apoi trece la data când vreau data de astăzi în format florin.
  • Cadrul Qunit documente propriile teste şi se pare destul de robust.  Se pot face lucruri simple cum ar fi testarea pentru egalitatea de şanse şi, de asemenea, are suport pentru apeluri de stil ajax (ambele "reală" sau batjocorit folosind dumneavoastră preferat mocker).
  • Trece prin procesul, de asemenea, vă obligă să cred că, prin marginea cazuri – ce se întâmplă cu "nedefinită" sau null este trecut într-o funcţie.  Ea face mort simplu pentru a testa aceste scenarii afară.  Bun îndesat.

Acoperire cu Blanket.js

Blanket.js completează Qunit de urmărire efectiv linii de cod care executa în cursul execută testele.  Aceasta integrează dreptul în Qunit astfel încât, chiar dacă este un întreg separate app, Acesta joacă frumos – se pare chiar ca este un app fără sudură.

Acest lucru este blanket.js în acţiune:

image Figura 4

image

Figura 5

(De fapt trebuie să faceţi clic pe caseta de selectare "Enable acoperire" din partea de sus [a se vedea figura 3] pentru a permite acest lucru.)

Liniile evidențiată în figura 5 nu au fost executate de către oricare din testele mele, aşa că am nevoie pentru a concepe un test care le determina să execute dacă vreau o acoperire completă.

Ia blanket.js de lucru urmând aceşti paşi:

  1. Descarca-l de la http://blanketjs.org/.
  2. Adăugaţi-l la proiect
  3. Actualizare pagina de harnaşament dumneavoastră test (QuizUtil_test.html în cazul meu) după cum urmează:
    1. Codul de referinţă
    2. Decora vă <script-ul> referinţă de genul asta:
    <script-ul tip= text/javascript"" src="QuizUtil.js" date-acoperi></script-ul>

Blanket.js preia atributul "date-capac" şi face magie sale.  Aceasta cârlige în Qunit, actualizări UI pentru a adăuga opţiunea "Enable acoperire" şi voila!

Rezumat (TL; DR)

Utilizaţi Qunit pentru a scrie ţi cazuri de testare.

  • Descarca-l
  • Adăugaţi-l la proiect
  • Scrie o pagină de test pe ham
  • Creează testele
    • Unele dintre codul dumneavoastră să fie testabile Refactor
    • Fii creativ!  Cred că de nebun, Imposibil de scenarii şi de testare-le oricum.

Utilizaţi blanket.js pentru a asigura acoperirea

  • Asiguraţi-vă că Qunit este de lucru
  • Descarca blanket.js şi adăugaţi-l la proiect
  • Adăugaţi-l la încercare Ham pagina:
    • Adauga o trimitere la blanket.js
    • Adauga un atribut "date-acoperi" ul <script-ul> Tag-ul
  • Rulaţi testele Qunit.

Niciodată nu am făcut orice de acest lucru înainte şi a avut unele chestii rudimentare de lucru într-o mână de ore. 

Fericit de testare!

</scop>

undefinedAboneaza-te la blog-ul meu.

Urmaţi-mă pe Twitter, la http://www.twitter.com/pagalvin

Costum ultimul vă voi purta vreodata?

[Rapid Notă-acesta este un post destul de lung pe un loc de muncă de deschidere pentru grupul meu de aici, în New York şi aveţi nevoie pentru a trăi în tri zona de stat în cazul în care sunteţi interesat.]

M-am alăturat Slalom Consulting peste 18 luni în urmă şi că acest lucru face treaba mea mai lungă durată de 2007. Nu planific o astfel. Înainte de un şir de ţopăit de job care a început cu meu salt în lumea de SharePoint, Am fost la un singur loc pentru unsprezece ani. L-am găsit în sfârşit un nou, loc de muncă pentru pe termen lung aici la Slalom de durată.

Acest loc este în creştere şi am nevoie de ajutor pentru a controla care. Un fel de ajutor trebuie este de obicei numit "Arhitect soluții SharePoint" deşi am găsit cuvântul arhitect fie peste sau incorect utilizate în spaţiul SharePoint pentru un timp destul acum. Am fost luptă pe cum pentru a blog despre acest lucru. Nu vreau pentru a lista pur şi simplu de o grămadă de puncte de glonţ în stil zaruri/Monster. Colegii mei excelente de recrutare au fost fac asta deja :). Deci, Am decis să ia o abordare "zi din viata". Citeşte-l şi să ia în considerare:

1) Dacă se face apel şi

2) Dacă ştiţi de în oase care le puteţi face-l.

Daca da, contactati-ma (Paul.Galvin@slalom.com) si hai sa vorbim.

Acestea sunt ceea ce vă puteţi aştepta să fac în tipic săptămână/lună ca un arhitect de soluţii echipa mea:

  • Proiecte, adesea mai multe la un moment dat. Unele proiecte sunt mari şi deci ar proprii ca un proiect. "Rulează" un proiect înseamnă că aveţi de supraveghere şi responsabilitate pentru calitatea generală de livrare. În aproape fiecare caz, veţi avea un PM si o echipă foarte puternică de devs, BAs, Oamenii UX, etc., pentru a vă sprijini. Dar veţi fi principale fata clientul vede, trusturi, etc. Există nici o ascunde în umbre în acest rol :). Vom factura acest timp şi scopul este de a tine destul de ocupat pentru a face acest lucru 80 la sută din timp.
  • Ajutor cu hârtiile – scroafe, RFPs, punţile – tot ce bun îndesat. Cred că avem procesul nostru de SCROAFĂ în jos destul de strâmt şi solide, astfel încât este destul de stereotipă. Dacă sunteţi folosite pentru scris scroafe astăzi, procesul nostru nu va fi o provocare pentru tine. RFPs – acestea sunt un pic mai greu. Ei tind să fie personalizat în natură pentru a începe cu şi RFPs trage de obicei în mai mulți autori diferite. Este şi bune şi rele, dar mai ales bun. Acest lucru poate obţine scrambly atunci când avem nevoie să jongleze nevoia de servicii excelente clientilor, de asemenea, încercarea de a câştiga noi de lucru. Tu probabil nu veţi proprii un RFP, dar vi se va cere să contribuie secţiuni.
  • Apeluri de vânzări, dar nu o mai strânsă. În curs de o lună, vă puteţi aştepta pentru a merge pe un cuplu de apeluri de vânzări cu echipa noastra de vanzari. Veţi fi IMM în cameră, ia notiţe şi de a ajuta forma soluţia. Cu toate acestea, tu nu va fi cerut sau aşteaptă pentru a gestiona ciclul de vânzări la început la sfârşit. Nu aveţi nevoie să "vândă,"trebuie doar pentru a fi vocea calmă motiv experţi în cameră. Aceasta se bazează încrederea şi thats de ce tu esti acolo. desigur, Dacă vă place de vânzare, apoi, e loc pentru tine să crească aici prea.
  • Ajuta cu recrutarea. Avem un fel de program de sesizare, Deci daca stii cu adevarat oameni puternici în Comunitate care credeţi că ar trebui să fie parte de Slalom, puteţi beneficia de acest fel. Ne-am dedicat de recrutare (Cine sunt excelente) pentru a face cea mai mare parte din acest tip de muncă. Real ajutor este intervievarea candidaţilor – sunt o potrivire bună cultural? Ştiu lucrurile lor? Pot ei face * meu * viaţa mai uşoară? 🙂 This comes in spurts, un cuplu de ori pe lună, Desi in unele luni ar nu se face la toate.
  • Ajuta defini cele mai bune practici, construi IP noastre şi ne face mai competitive în piaţa. Sunteţi un experimentat tip/gal. Aţi fost în jurul blocului – nu doar în SharePoint, dar aveţi experienţă în alte tehnologii şi a trăit prin bune şi rele (chiar şi teribil) proiecte de peste tot. Ca rezultat al, stii ce funcţionează şi ce nu. Vom dori să împărtăşesc această experienţă cu noi pe o bază de zi cu zi într-un sens tactic (adică. proiectele dumneavoastra a alerga foarte bine) dar, de asemenea, strategic. "Cele mai bune practici" este un pic suprasolicitat ca un termen şi ezita să-l utilizaţi. Ideea de bază este că sunteţi vine ca o persoană cu experienţă, cu experienţă profundă şi relevante şi vrem să integreze cele mai bune din cunoştinţele dumneavoastră în modul în care interacţionează cu clienţii pe o bază de zi cu zi.
  • distracţie plăcută -Suntem o grămadă foarte integrat. Vreau pentru a evita încă o platitudine, dar este foarte apt în acest caz-vom munci din greu (un fel de) şi am juca chiar mai greu :). Există un fel de Aaron Sorkin de bătaie de joc de aici, camera este întotdeauna plin de oameni inteligent, ne place noastre băutură şi organizăm un număr echitabil de distracţie evenimente-noapte film, excursii de baseball (chiar dacă acestea sunt oribil, practic rău echipe).

În cazul în care ar putea suma-l într-un singur cuvânt, Mi-ar folosi cuvântul "conducere." Conduce proiecte, ia un rol principal în construirea afară practica (IP, construirea echipei), etc.

Dar aşteptaţi! Există mai multe! De ce altceva de lucru la Slalom?

  • Remarcabil unitate de intenţie-toată lumea vrea să crească acest lucru afară. "Acest lucru" este la birou New York. Toată lumea este la bord cu această.
  • Vânt în vele – sora birouri, sora practici-Slalom este un serviciu"plin" organizaţie de consultanţă. Conduc până practica SharePoint (o "practică zonă duce" în jargon de Slalom). Am sora practici la 11 alte birouri de Slalom. Deci chiar dacă eu sunt regele măsura SharePoint este în cauză aici la Slalom New York, Am practici de la egal la egal în Chicago, Seattle, Dallas, Atlanta, Boston, etc. de unde pot trage la suport. Este cu adevărat cel mai bun din ambele lumi-autonomie semnificativ aici, în New York, dar accesul la tone de talent în cadrul unei organizaţii.
  • Vânt în vânzări (2) -Putem face mai mult decât SharePoint – mult mai. Facem BI, CRM, UX, de afaceri consulting, Mobile, personalizat de dezvoltare si altele. Suntem buni la Crucea de vânzare între noi şi noi suntem bun la pictură – şi, mai important, livrarea la – o imagine "servicii complete" pentru clientii nostri. Acest lucru este deosebit de atrăgătoare pentru mine. Am fost la multe orgs mai mici de lucru SharePoint gig-uri şi frustrat peste si peste din nou pentru că am fost porumbelul holed ca "poporul SharePoint." Asta nu se întâmplă cu Slalom şi vom ajunge pentru a face munca mult mai interesant ca rezultat.
  • Model local – nici o călătorie.
  • Termen lung de creştere-Slalom a fost întâmplă gangbusters. O mulţime de creştere şi stabilitate. De creştere, de asemenea, înseamnă că avem nevoie de a angaja lideri astăzi la cap până la echipele din noua ca vom adăuga mai multe clientii si personalul pentru a sprijini aceste clienti.

Am putea merge pe, dar am plecat deja, probabil, prea mult timp. Cred că am-am captat esenţa aici. Dacă sunteţi de gândire despre schimbarea de locuri de muncă şi acest lucru pare bine să vă, hai sa vorbim.

Dacă sunteţi fericit la job-ul-hai sa vorbim oricum :). Am fost în multe locuri, şi a fost foarte "fericit" la momentul. Slalom este diferit şi mi-ar saluta o sansa de a va convinge de faptul că.

</scop>

undefinedAboneaza-te la blog-ul meu.

Urmaţi-mă pe Twitter, la http://www.twitter.com/pagalvin

Rapid şi uşor: Seta mărimea o elemente într-o casetă listă într-un App Windows Store

Într-un Windows Store App eu sunt crearea de, Vreau să arate utilizatorului diverse mesaje informative.  Am luat o casetă listă ca instrumentul să-l arate astfel încât acestea pot parcurge ei şi tot ce bun îndesat. 

Mesajele sunt doar informative, Deci nu este nevoie să furnizeze toate că extra spaţiu în jurul lor, deoarece utilizatorul nu le puteţi selecta pentru nimic.  Comportamentul implicit din caseta de listare permite oferă o sumă substanţială de umplutură şi am vrut să scap de ea.  Ei bine.... nu se poate face ca un fel de lucru pe caseta de listare permite direct.  CU TOATE ACESTEA, puteţi face acest lucru la elementele adăugaţi:

        privat nule AddGameStateLogMessage(şir theMessage)
        {
            TextBox t = noi Casetă text();
            t.Text = GameStateCounter    + ": " + theMessage;
            t.TextWrapping = TextWrapping.Wrap;
            t.MinWidth = 400;
            Grosime thisPadding = noi Grosimea(5, 0, 5, 0);
            t.Padding = thisPadding;
            t.FontSize = 12;

            ListBoxItem li = noi ListBoxItem();
            li.Conţinut = t;
            li.MaxHeight = 25;
            thisPadding = noi Grosimea(5, 0, 5, 0);
            li.Umplutură = thisPadding;

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

în cele de mai sus, Am crea o casetă text şi setarea sale font, umplutură sale, etc.

Următoarea, Am crea un ListBoxItem şi a stabilit conţinutul său pentru a casetă de text formatat.

În cele din urmă, Am introduceţi ListBoxItem în caseta de listare permite.  (Vreau să Arată cele mai recente mesaje în partea de sus a listei, prin urmare, Insert(0,li) în loc de un simplu Add() invocarea.).

Am va fi tweaking acest lucru un pic înainte sunt foarte fericit cu comportamentul ListBox dar modelul prezentat mai sus a fost foarte fructuoasă.  Sperăm că altcineva se găseşte ajutor.

</scop>

undefinedAboneaza-te la blog-ul meu.

Urmaţi-mă pe Twitter, la http://www.twitter.com/pagalvin