Come specificare la gente come un ambito di ricerca / Origine di contenuto utilizzando SharePoint 2013 API REST

Ho avuto ragione a lavorare con SharePoint 2013 API di ricerca tramite REST per la prima volta. Ho voluto cercare persone, non documenti. La chiave qui è quella di apprendimento è specificare origini di contenuto tramite il relativo GUID (o almeno in questo caso). Illustrato nel seguente frammento di jQuery come:

    loadExpertsAsync: funzione() {

        jQuery.support.cors = true;

        $.AJAX({
            URL: Questo.CreateFullApiUrl() +
                "?QueryText = 'portali'&SourceId = 'b09a7990-05ea-4af9-81ef-edfab16c4e31'" +
                "&scegliereProprietà ='LinkedInProfileUrl,GoogleCirclesProfileUrl,BALargeProfilePictureUrls,BAGridPictures,WorkEmail,Competenze,AboutMe,Interessi,JobTitle,PastProjects,PictureURL,PictureURL,TwitterHandle,LinkedInProfileUrl,PictureURL,GoogleCirclesProfileUrl'" +
                "&ROWLIMIT = 99",
            Metodo.: "Ottieni",
            intestazioni: { "Accettare": "applicazione/json; OData = verbose" },
            cache: falso,
            successo: funzione (risultato) {

Nel mio caso, Sono in esecuzione le API contro SharePoint online. Per ottenere il GUID, Ho seguito questi passaggi:

  1. Accesso al centro di admin di SharePoint
  2. Selezionare "Cerca" dalla mano sinistra spostamento
  3. Selezionare "Gestione fonti di risultato"
  4. Selezionare "Risultati di gente locale"
  5. Guardate l'URL.

Il mio URL sembrava qualcosa come:

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

Il parametro sourceid è ciò che ha funzionato per me.

(Capisco che il sourceid potrebbe in realtà essere una sorta di permanente cosa con SP, ma sarò sempre controllare comunque 🙂 ).

</fine>

undefinedIscriviti al mio blog.

Seguimi su Twitter a http://www.twitter.com/pagalvin

Esempio SharePoint resto chiamate

Ecco una serie di chiamate di resto di campione che funziona per me e può aiutarvi anche. Come di 02/2014, ci sono due esempi 🙂

  1. Fare riferimento a una colonna con spazi nel nome
  2. Fare riferimento a una colonna di seleziona multipla
  3. Eseguire una ricerca di persone tramite il resto

 

Aggiungerò a questo col passare del tempo.

Qui ci sono alcuni inchiostri utili che ho trovato pure:

Fare riferimento a una colonna con spazi nel nome

Creare un elenco personalizzato con una colonna denominata "Autore del Blog" (spazio tra il Blog e autore).

Il $select per fare riferimento a tale colonna è:

image

Semplicemente sostituire lo spazio con "_x0020_". Vediamo la _x0020_ in molti esempi in tutto il internets e resto non è diverso.

Se non fai che, Tu sei responsabile ottenere un messaggio di errore come questo:

L'espressione “Autore del Blog” non è valido.

Abbastanza facile.

Fare riferimento a una colonna di ricerca selezione multipla

Impostare:

  1. Creare un elenco personalizzato denominato categorie.
  2. Aggiungi alcune categorie. Ho aggiunto questa convenzione categorie:image
  3. Creare un altro elenco personalizzato denominato MockBlog e aggiungere categorie come una colonna di elenco di selezione multipla (o colonna del sito se questo è come si tira).

Aggiungere alcuni elementi all'elenco Mockblog e siete pronti.

Una chiamata di stile Ajax utilizzando jQuery avrà un aspetto come questo:

  = serverUrl "/API/web/liste/GetByTitle('MockBlog')/elementi" +
             "?$Selezionare = titolo,Categorie/titolo,Blog_x0020_Author/titolo" + 
             "&$Espandere = Blog_x0020_Author,Categorie";

Stiamo raccontando SharePoint "Dammi il titolo per tutte le categorie (Categorie/titolo). Ottenere i valori effettivi per Titolo da $EspandereING elenco categorie." (Mio parafrasando riposante è probabilmente abbastanza sciolto, ma questo come sto interpretarlo).

Se stai facendo questo tramite JavaScript e usando Fiddler a guardare l'output, qualcosa di simile si ottiene in cambio:

 

image

(Quanto sopra è un oggetto JSON)

Eseguire una ricerca di persone tramite il resto

Ho bloggato su questo separatamente. La chiave è quello di specificare un parametro sourceid cui valore è il GUID dell'origine di contenuto gente locale. (Le origini di contenuto usato per essere chiamato ambiti ed è oh-mio così difficile non chiamare tutto un ambito per me!).

Per saperne di più su di esso qui: http://www.mstechblogs.com/paul/?p=10385

 

</fine>

undefinedIscriviti al mio blog.

Seguimi su Twitter a http://www.twitter.com/pagalvin

Facile e veloce: Creare un sito di SharePoint utilizzando il resto

Ci è un sacco di risorse intorno che mostrano come fare questo, ma non riuscivo a trovare un link completo go-a, così siamo qui.

È possibile creare un sito di SharePoint utilizzando l'API REST.  Ecco un esempio completamente al forno:

<!--
    SiteRequestForm.html: Raccogliere informazioni e creare un sito per l'utente.
-->

<centro>
<tabella>
    <TR>
        <TD>Nome del sito:</TD>
        <TD><ingresso tipo= "testo" nome= "NomeSito" Identificazione= "NomeSito" /></TD>
    </TR>
    <TR>
        <TD colspan= 2"">
            <ingresso tipo= "Invia" Identificazione= CreateSiteButton"" valore= "Crea il sito" />
        </TD>
    </TR>
</tabella>
</centro>

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

<script di>
var CreateSiteLogicContainer = {

    createSiteData: {
            «parametri": {
                __metadata: { "tipo": "SP.WebInfoCreationInformation" },
                URL: "Paultest1",
                Titolo: "Paultest1",
                Descrizione: "web resto-creato da Paolo!",
                Lingua: 1033,
                WebTemplate: m."",
                UseUniquePermissions: falso
            }
    },

    createSite: funzione () {

        jQuery.support.cors = true;

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

            intestazioni: {
                "Accettare": "application/json; OData = verbose",
                "content-type": "application/json;OData = verbose",
                "X-RequestDigest": $("#__REQUESTDIGEST").Val()
            },

            dati: Stringify(CreateSiteLogicContainer.createSiteData),

            successo: funzione () { avviso("il successo"); },
            errore: funzione () { avviso("errore"); }

        });
    },

    wireUpForm: funzione () {
        $("#CreateSiteButton").fare clic su(funzione () {
            avviso("Per cercare di creare il sito.");
            CreateSiteLogicContainer.createSite();
        });
    }


}

CreateSiteLogicContainer.wireUpForm();

</script di>

Quando è successo, si ottiene un pacchetto JSON in risposta come questo:

image

I miei pensieri chiavi e apprendimenti da questo includono:

  • Questo approccio utilizza jQuery.  Nel mio caso, mia libreria jQuery si trova in ".../ plugin. "  Ti consigliamo di cambiare che per puntare alla tua posizione preferita di JQ.
  • È possibile copiare e incollare quel frammento intero in una Web Editor contenuto Part in una pagina e dovrebbe funzionare bene.  Ti consigliamo di cambiare il punto di fine della chiamata API e assicurarsi che si fa riferimento JQ correttamente.
  • L'URL è relativo dell'endpoint di API.  Nel mio caso, è la creazione di siti secondari sotto https://bigapplesharepoint.com
  • Non è necessario fornire una contenuto-lunghezza. Alcuni blog e MSDN documento implica che si fa, ma è successo per me automaticamente, che presumo viene gestita dalla chiamata del AJAX $.
  • Questa linea è necessaria al fine di evitare una risposta "proibita": "X-RequestDigest": $("#__REQUESTDIGEST").Val().  Ci sono altri modi per farlo, ma questo è abbastanza piacevole.  Ho perso il link al blog che ha fornito questa scorciatoia.  H/T a voi, misteriosa blogger!

Buona fortuna e spero che questo aiuti qualcuno fuori.

</fine>

undefinedIscriviti al mio blog.

Seguimi su Twitter a http://www.twitter.com/pagalvin

Superare il fastidioso problema con gli URL relativi in lancio rapido di SharePoint

Volevo aggiungere un link per la navigazione veloce lancio l'altro giorno e mi ha detto che SharePoint:

image

Versione testo puro di che è:

Verificare che l'URL è valido e inizia con un carattere valido (cancelletto (#) o barra (/)) o un protocollo valido supportato (per esempio, ' http://’, ' https://’, ' file://’, ' ftp://’, ' mailto:’, ' notizie:’).

"Blech e pox!"Ho detto.

Una soluzione alternativa a questo è utilizzare JavaScript per trovare un link noto nel lancio rapido ed eseguire l'override del relativo comportamento.

Per testare questa, aggiungere un nuovo link al tuo sito di prova questa convenzione:

image

Ho usato jQuery. Per risolverlo, ottenere alcuni JavaScript e jQuery nella pagina utilizzando la vostra tecnica preferita e con una riga di codice come questo:

 

$(documento).pronto( funzione () {

    $("un:contiene('Test sostituzione URL')").fare clic su(funzione () { avviso("comportamento modificato Clicca!"); ritorno falso;});

});

E tuo zio Bob.

Il selettore di jQuery trova ogni <un> Tag che ha "Sostituzione del Test URL" nel suo nome. È possibile trovare-melodia che a seconda del tuo link e simili.

La Clicca(funzione() esegue l'override di qualsiasi SharePoint avrebbe fatto quando l'utente fa clic su. Assicurarsi che "return false", altrimenti sarà fare la tua roba e poi provare a href cosa troppo, che non è quasi certamente il vostro obiettivo.

Questo è stato fatto e prova in un ambiente di SharePoint online, ma dovrebbe funzionare bene in 2010 e all'inizio troppo.

</fine>

undefinedIscriviti al mio blog.

Seguimi su Twitter a http://www.twitter.com/pagalvin

Semplice e veloce: SharePoint resto chiamare solo ritorni 100 Record

Sto lavorando su un sito web di fronte pubblico per la mia pratica di SharePoint qui in New York e utilizza un sacco di chiamate JavaScript e resto per mostrare i contenuti.

Durante lo sviluppo del mainline, Creare un piccolo set di dati con solo 10 o così le righe in un elenco personalizzato e tutte le mie chiamate resto tirato da lì.  Una volta ho urtato l'elenco per avere qualche centinaia di righe di dati per il test di crescita atteso, Ho trovato che mi stavo esattamente 100 righe restituite indietro sulle mie chiamate resto.

Questa è una cosa molto semplice indirizzo.  Nel mio caso (e credo che nella maggior parte dei casi), l'impostazione predefinita resto chiama per SharePoint (e possibilmente come uno standard industriale?) ritorno 100 righe.  Per restituire più di default, utilizzare il parametro $top su chiamata, come in:

OTTENERE /Insights Dev/_api/web/lists/GetByTitle('MockBlog')/elementi?$selezionare = ID,Titolo,Categorie/titolo,Blog_x0020_Author/titolo,DatePublished,BlogSummary&$Espandere = Blog_x0020_Author,Categorie&$filtro =&$Top = 9999

Ho scelto 9999 in questo caso da allora so che growth-wise, non ci sarà più di 200 o così aggiunte a questo elenco in un anno.  Se diventa sgraziato, Noi possiamo attuare qualche spostamento lungo la strada.

</fine>

undefinedIscriviti al mio blog.

Seguimi su Twitter a http://www.twitter.com/pagalvin

Semplice e veloce: Risolvere "parametro URL non valido” problema con UpdateListItems in lists

Quando si lavora con UpdateListItems via lists, è facile da generare l'errore:

Parametro URL non valido.

L'URL fornito contiene un comando o un valore non valido. Si prega di controllare nuovamente l'URL.

È possibile ottenere questo errore quando si dimentica di includere ID nell'elenco dei campi per l'aggiornamento.  Questo, come un sacco di questi SP servizi web, è un po' controintuitivo, poiché è necessario includere l'ID nell'attributo ID della <Metodo> elemento.  E tu non sei aggiornato ID e probabilmente mai desidera in primo luogo.

Questa busta SOAP opere:

<soapenv:Busta xmlns:soapenv =' http://schemas.xmlsoap.org/soap/envelope/'>
  <soapenv:Corpo>                      
    <UpdateListItems xmlns =' http://schemas.Microsoft.com/SharePoint/SOAP/'>                     
      <listName>{C712E2EA-54E1-47AD-9D99-1848C7773E2F}</listName>                     
        <aggiornamenti>                     
         <Lotto OnError ="Continuare">
          <Metodo ID =1"" Cmd ="Aggiornamento">
            <Nome campo ="CooperativeLock">bloccato!</Campo>
            <Nome campo ="ID">1</Campo>
          </Metodo>
        </Lotto>                     
        </aggiornamenti>                
      </UpdateListItems>             
  </soapenv:Corpo>         
</soapenv:Busta>

Se striscia fuori il riferimento del campo ID, si otterrà il fastidioso messaggio "Parametro URL non valido".

</fine>

undefinedIscriviti al mio blog.

Seguimi su Twitter a http://www.twitter.com/pagalvin

 

Povero uomo di memorizzazione nella cache in JavaScript

[TL;Versione DR: utilizzare i cookie per memorizzare i risultati delle chiamate asincrone; rendere immediatamente i risultati delle precedenti chiamate asincrone e poi convalidarli dopo il caricamento della pagina.]

Sto lavorando sul sito intranet SharePoint per un cliente che caratterizza, tra le altre cose, una navigazione secondaria stilizzato cui opzioni di menu sono gestiti tramite un elenco personalizzato di vecchio regolare.  L'idea è che il cliente ottiene controllare il menu del "loro" sito senza influenzare o colpiti dalla navigazione globale messa da esso.

(c'è qualcosa di incredibilmente sovversiva sull'aggiunta di un CEWP che punta a un file HTML che carica alcuni CSS e JS per modificare sostanzialmente quasi tutto ciò che riguarda il comportamento di un sito... ma che è per un altro post)

Il codice per questo abbastanza semplice:

Qui il punto dolente è che ogni volta che qualcuno colpisce una delle pagine del sito, browser web dell'utente è protesa per ottenere elementi dall'elenco.  Una volta dev è completa e test ha dimostrato le cose per essere stabile e completa, Questa chiamata è inutile più di 99% del tempo poiché il menu cambia raramente.  Ha anche un effetto strano di UI che è comune in questo mondo nuovo iper-ajaxy siti web – il rendering della pagina e solo allora esegue il rendering dal menu.  È nervosa e fastidioso a mio parere.  E nervosa. Così, memorizzazione nella cache. 

Ho modificato la logica di questa convenzione:

  • Cercare un cookie nel browser che contiene il menu come ultima leggerla
    • Se trovato, rendere immediatamente.  Non aspettare che la pagina completare il caricamento.  (È necessario assicurarsi che il codice HTML è strategicamente collocato qui, ma non è difficile da fare).
  • Attendere la pagina di finire il caricamento e fare un async chiamare per caricare le voci di menu da un elenco utilizzando il resto o lists o qualunque
  • Confrontare quello che ho ottenuto con il cookie
    • Se corrisponde a, FERMATA
    • In caso contrario, usando jQuery, popolare dinamicamente un mazzo se <li>di in un <UL>
  • Utilizzare i CSS per fare la formattazione
  • Profitto!

Alcuni di voi stanno andando a dire, "Ehi! non non c'è nessun reale cache succedendo qui dato che stai leggendo il menu comunque ogni singola volta.”  E hai ragione-non sto dando il server qualsiasi tipo di pausa.  Ma perché la chiamata è async e accade dopo che la pagina iniziale di payload HTML rende pienamente, ci si "sente" più reattivo all'utente.  Il menu rende abbastanza tanto come disegna la pagina.  Se il menu succede al cambiamento, l'utente è soggetto a un ri-disegnare nervosa del menu, ma solo che una volta.

Ci sono alcuni modi per rendere più efficace questa memorizzazione nella cache e il server possono aiutare allo stesso tempo:

  • Mettere in una regola che il "cookie cache" è valida per un minimo di 24 ore o qualche altro lasso di tempo. Finchè non non c'è alcun cookie scaduti, utilizzare snapshot menu del cookie e mai colpito il server.

Beh... questo è tutto quello che mi vengono in mente ora :). 

Se qualcuno ha qualche idea intelligente qui mi piacerebbe conoscerli.

E infine – questa tecnica può essere utilizzata per altre cose.  Pagina su questo client ha un certo numero di cose basate su dati sulle varie pagine, molti di loro modifica relativamente raramente (come una volta a settimana o una volta al mese).  Se destinazione specifiche aree di funzionalità, si può dare un'interfaccia utente più reattiva tirando il contenuto dall'archivio locale cookie e rendendo immediatamente.  Ci si sente più velocemente all'utente anche se non si sta salvando il server qualsiasi cicli.  Si può salvare i cicli server decidendo su alcune condizioni e trigger per invalidare questa cache cookie locale.  Che è tutto situazionale e artsy roba e veramente la più divertente :). 

</fine>

undefinedIscriviti al mio blog.

Seguimi su Twitter a http://www.twitter.com/pagalvin

Come si fa: Configurare Unit Test e Test Coverage con QUnit.js e Blanket.js per un ufficio 365 SharePoint App

Intro

Hai esplorato unit test e test copertura per JavaScript come io lavoro su una nuova applicazione di SharePoint per SharePoint online in ufficio 365 Suite.  I percorsi di ricerca ovvio mi ha portato a Qunit.js e subito dopo che, A Blanket.js.

QUnit mi permetta di creare unit test e raggrupparli in moduli.  Un modulo è solo un semplice modo per organizzare i test correlati. (Non sono sicuro che sto usandolo come previsto, ma si sta lavorando per me finora con il piccolo insieme di test che finora ho definito).

Blanket.js integra con Qunit e mi mostrerà le linee effettive di JavaScript che sono stati – e ancora più importante – non sono stati effettivamente eseguite nel corso di esecuzione dei test.  Questa è la "copertura" – linee che eseguiti sono coperti dal test, mentre altri non sono.

Tra impostazione buone test case e visualizzazione di copertura, possiamo ridurre il rischio che il nostro codice ha nascosto i difetti.  Bei tempi.

Qunit

Assumendo che abbiate il vostro Visual Studio progetto impostato, inizia scaricando il pacchetto JavaScript da http://qunitjs.com.  Aggiungere JavaScript e CSS corrispondente alla soluzione.  Miniera assomiglia a questo:

image

Figura 1

Come si può vedere, Stavo usando 1.13.0 al momento ho scritto questo post del blog. Non dimenticate di scaricare e aggiungere il file CSS..

Che fuori del modo, il passo successivo è creare una sorta di prova imbrago e i bit Qunit di riferimento.  Sto testando un sacco di funzioni in un file di script chiamato "QuizUtil.js", così ho creato una pagina HTML denominata "QuizUtil_test.html" come mostrato:

image Figura 2

Ecco il codice:

<!DOCTYPE html>
<html xmlns= "http://www.w3.org/ 1999/xhtml">
<testa>
    <titolo>QuizUtil prova con Qunit</titolo>
    <link rel= "stylesheet" href="../CSS/qunit-1.13.0.CSS" />
    <script di tipo= text/javascript"" src="QuizUtil.js" dati-copertina></script di>
    <tipo di script ="text/javascript" src ="qunit-1.13.0.js"></script di>
    <tipo di script ="text/javascript" src ="blanket.min.js"></script di>

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

            uguale(getIDFromLookupField(goodValue) + 1, 2), "ID del [" + goodValue + "] + 1 dovrebbero essere 2";
            uguale(getIDFromLookupField(non definito), non definito, "Undefined argomento di input deve restituire un risultato indefinito.");
            uguale(getIDFromLookupField(""), non definito, "Argomento di input vuoto deve restituire un valore indefinito.");
            uguale(getIDFromLookupField("gobbledigood3-thq;dkvn ada;skfja sdjfbvubvqrubqer0873407t534piutheqw;VN"), non definito,"Deve sempre restituire un convertibile del risultato in un valore Integer");
            uguale(getIDFromLookupField(2";#qualche altra persona"), 2"", "Checking [2;#qualche altra persona].");
            uguale(getIDFromLookupField("9834524;#valore Long"), "9834524", "Prova di grande valore.");
            notEqual(getIDFromLookupField("5;#chiunque", 6), 6, "Prova un notEqual (5 non è uguale a 6 per questo esempio: [5;#chiunque]");

        });

        modulo("htmlEscape");
        test("QuizUtil htmlEscape()", funzione () {
            uguale(htmlEscape("<"), "&lt;", "Fuga a meno che l'operatore ('<')");
            uguale(htmlEscape("<classe div =  "someclass">Qualche testo</div>"), "&lt;div class =&quot;SomeClass&quot;&gt;Qualche testo&lt;/div&gt;", "Stringa di test più complesso.");
        });

        modulo("getDateAsCaml");
        test("QuizUtil getDateAsCaml()", funzione () {
            uguale(getDateAsCaml(Nuovo Data("31/12/2013")), "31T-12-2013:00:00:00", "Test data duramente codificato: [12/31/2013]");
            uguale(getDateAsCaml(Nuovo Data("01/05/2014")), "05T-01-2014:00:00:00", "Test data duramente codificato: [01/05/2014]");
            uguale(getDateAsCaml(Nuovo Data("01/31/2014")), "31T-01-2014:00:00:00", "Test data duramente codificato: [01/31/2014]");
            uguale(getTodayAsCaml(), getDateAsCaml(Nuovo Data()), "getTodayAsCaml() dovrebbe essere uguale getDateAsCaml(nuova data())");
            uguale(getDateAsCaml("valore di sciocchezze"), non definito, "Cercare di ottenere la data di un valore di sciocchezze.");
            uguale(getDateAsCaml(non definito), non definito, "Cercare di ottenere la data della [non definito] Data.");
        });

        modulo("getParameterByName");
        test("QuizUtil getParameterByName (dalla stringa di query)", funzione () {
            uguale(getParameterByName(non definito), non definito, "Cercare di ottenere indefinito parametro deve restituire indefinito.");
            uguale(getParameterByName("non esiste"), non definito, "Cercare di ottenere il valore del parametro quando sappiamo che il parametro non esiste.");

        });

        modulo("Cookies");
        test("QuizUtil varie funzioni di biscotto.", funzione () {
            uguale(setCookie("prova", 1"", -1), getCookieValue("prova"), "Get un cookie ho impostato dovrebbe funzionare.");
            uguale(setCookie("anycookie", 1"", -1), true, "L'impostazione di una cucina valida deve restituire 'vero'.");
            uguale(setCookie("nome del cookie pazzo !@#$%"%\^&*(()?/><.,", 1"", -1), true, "L'impostazione di un nome di cookie male deve restituire 'falsa'.");
            uguale(setCookie(non definito, 1"", -1), non definito, "Passing indefinito come il nome del cookie.");
            uguale(getCookieValue("non esiste"), "", "Cookie non esiste prova.");
        });

    </script di>
</testa>
<corpo>
    <div Identificazione= qunit""></div>
    <div Identificazione= "qunit-apparecchio"></div>

</corpo>
</html>

Ci sono parecchie cose che succedono qui:

  1. Il mio codice di riferimento (QuizUtil.js)
  2. Riferimento Qunity.js
  3. Definizione di alcuni moduli (getIDFromLookup, Cookies, e gli altri)
  4. Posizionando un <div> cui ID è "qunit".

Poi, Basta tirare su questa pagina e si ottiene qualcosa di simile:

image

Figura 3

Se guardi nella parte superiore, avete alcune opzioni, di cui due sono interessanti:

  • Nascondi superato test: Abbastanza evidente.  Può aiutare il vostro occhio vedere solo le aree di problema e non un sacco di confusione.
  • Modulo: (cadere giù): Questo consente di filtrare i test fino a solo quei gruppi di test che si desidera.

Per quanto riguarda i test stessi – alcune osservazioni:

  • Va da sé che è necessario scrivere codice, tale che in primo luogo è testabile.  Utilizzando lo strumento può aiutare a far rispettare tale disciplina. Per esempio, Ho avuto una funzione chiamata "getTodayAsCaml()”.  Questo non è verificabile molto poiché non prende nessun argomento di input e per verificare l'uguaglianza, dobbiamo costantemente aggiornare il codice di test per riflettere la data corrente.  Si rifattorizzato aggiungendo un parametro di input dati e passando la data corrente quando voglio la data odierna nel formato CAML.
  • Quadro Qunit documenta le proprie prove e sembra piuttosto robusto.  Possono fare cose semplici come test per l'uguaglianza e ha anche il supporto per le chiamate in stile ajax ("reale" o utilizzando il tuo preferito mocker deriso).
  • Passando attraverso il processo anche ti costringe a pensare attraverso casi limite – cosa succede con "undefined" o in una funzione viene passato null.  Lo rende morto semplice testare questi scenari fuori.  Roba buona.

Copertura con Blanket.js

Blanket.js completa Qunit l'effettive righe di codice che vengono eseguite durante il corso dell'esecuzione di test di rilevamento.  Esso integra diritto in Qunit anche se che è una app completamente separati, gioca bene – sembra davvero che è una app senza soluzione di continuità.

Questo è blanket.js in azione:

image Figura 4

image

Figura 5

(In realtà devi cliccare sulla casella di controllo "Attiva la copertura" nella parte superiore [Vedi figura 3] per consentire questo.)

Le righe evidenziate in figura 5 non sono stati eseguiti da alcuna delle mie prove, quindi ho bisogno di elaborare un test che causano loro di eseguire se voglio piena copertura.

Ottenere blanket.js lavorando seguendo questi passi:

  1. Scaricalo da http://blanketjs.org/.
  2. Aggiungerlo al progetto
  3. Aggiornare la tua pagina di prova imbrago (QuizUtil_test.html nel mio caso) come segue:
    1. Il codice di riferimento
    2. Decorare il vostro <script di> riferimento come questo:
    <script di tipo= text/javascript"" src="QuizUtil.js" dati-copertina></script di>

Blanket.js preleva l'attributo "dati-copertina" e fa la sua magia.  Aggancia Qunit, Aggiorna l'interfaccia utente per aggiungere l'opzione "Abilita la copertura" e voilà!

Riassunto (TL; DR)

Utilizzare Qunit per scrivere i test case.

  • Scaricarlo
  • Aggiungerlo al progetto
  • Scrivere una pagina di prova imbrago
  • Creare i test
    • Rifattorizzare alcuni del codice sia testabile
    • Essere creativi!  Pensare di crazy, scenari impossibili e li prova comunque.

Utilizzare blanket.js per garantire una copertura

  • Assicurarsi che il Qunit sta lavorando
  • Scarica blanket.js e aggiungerlo al progetto
  • Aggiungere alla tua pagina di prova imbrago:
    • Aggiungere un riferimento a blanket.js
    • Aggiungere un attributo "dati-copertura" al vostro <script di> Tag
  • Eseguire i test Qunit.

Non ho mai fatto nulla di tutto questo prima e aveva alcune cose rudimentali in una manciata di ore di lavoro. 

Test felice!

</fine>

undefinedIscriviti al mio blog.

Seguimi su Twitter a http://www.twitter.com/pagalvin

La tuta ultima che vi verrà mai indossare?

[Rapido nota – questo è un post abbastanza lungo su un lavoro di apertura per il mio gruppo qui a New York e si ha bisogno di vivere nella zona di tri-state, se siete interessati.]

Sono entrato in Slalom Consulting sopra 18 mesi fa e ciò che rende il mio lavoro di più lunga durata dal 2007. Non ha intenzione e in questo modo. Prima di una stringa di lavoro salti che ha iniziato con il mio salto nel mondo di SharePoint, Ero in un unico luogo per undici anni. Finalmente ho trovato un nuovo, duraturo posto a lavorare per il lungo raggio qui a Slalom.

Questo posto sta crescendo e ho bisogno di aiuto per controllare che. Il tipo di aiuto di che ho bisogno solito è chiamato un "SharePoint Solutions Architect" anche se ho trovato la parola architetto essere oltre e/o erroneamente utilizzato nello spazio di SharePoint per un bel po ora. Ho lottato su come su questo blog. Non voglio elencare semplicemente fuori un mazzo di punti elenco in stile dadi/Monster. Miei coetanei reclutamento eccellente hanno fatto che già :). Così, Ho deciso di adottare un approccio "day in the life". Letto e prendere in considerazione:

1) Se fa appello e

2) Se sai che nelle tue ossa che si può fare.

Se sì, contatto con me (Paul.Galvin@slalom.com) e Let's talk.

Si tratta di che cosa si può aspettare di fare nella tipico settimana/mese come un architetto di soluzioni sulla mia squadra:

  • Eseguire progetti, spesso più di uno alla volta. Alcuni progetti sono grandi e così sarebbe proprio quel uno progetto. "Running" un progetto significa che avete la supervisione e responsabilità per la qualità complessiva della consegna. In quasi ogni caso avrete un PM e un team veramente forte di devs, BAs, Persone UX, ecc., a sostenervi. Ma ti verrà la faccia principale che il cliente vede, Trust, ecc. Non non c'è nessun nascondersi nelle ombre in questo ruolo :). Questa volta sarà la fatturazione e l'obiettivo è quello di tenervi occupati abbastanza per fare questo 80 per cento del tempo.
  • Aiuto con pratiche burocratiche – scrofe, RFP, ponti – tutto ciò che buona roba. Penso che abbiamo il nostro processo di scrofa giù abbastanza stretto e solido, quindi è abbastanza stereotipata. Se siete abituati a scrivere oggi scrofe, il nostro processo non sta andando essere una sfida per te. RFP – queste sono un po ' più difficile. Essi tendono ad essere su misura in natura per cominciare e RFP tirare in genere nei più diversi autori. È sia buono e cattivo, ma soprattutto buona. Questo può ottenere scrambly quando abbiamo bisogno di destreggiarsi tra la necessità di un servizio clienti eccellente mentre cercava anche di vincere di nuovo lavoro. Che probabilmente non possiedi un RFP ma vi verrà chiesto di contribuire a sezioni.
  • Chiamate di vendite, ma non una più stretta. Nel corso di un mese, ci si può aspettare di andare su un paio di chiamate di vendite con il nostro team vendite. Sarete le PMI nella stanza, prendere appunti e aiutare a formare la soluzione. Tuttavia, non ha chiesto o prevede di gestire il ciclo di vendita dall'inizio alla fine. Non hai bisogno di "vendere,"Hai solo bisogno di essere la voce calma della ragione esperto in camera. Questo costruisce la fiducia ed è per questo che ci sei. Naturalmente, Se ti piace vendere, poi c'è spazio per poter crescere qui troppo.
  • Aiuto con il reclutamento. Abbiamo una sorta di programma di rinvio, quindi se sai davvero forte gente nella Comunità, che si pensa dovrebbero essere parte di Slalom, si può beneficiare in questo modo. Abbiamo dedicato i reclutatori (Chi sono eccellenti) a fare la parte del Leone di questo tipo di lavoro. Il vero aiuto è intervistando i candidati – sono una buona misura culturalmente? Sanno loro roba? Possono fare * mia * vita più facile? 🙂 Questo avviene a scatti, un paio di volte al mese, anche se in alcuni mesi si sarebbe non farlo a tutti.
  • Aiutare a definire le migliori pratiche, costruire il nostro IP e ci rendono più competitivi nel mercato. Sei una ragazzo/ragazza con esperienza. Sei stato tutto il blocco – non solo in SharePoint, ma avete esperienza in altre tecnologie e vissuto bene e male (anche terribile) progetti all over. Di conseguenza, sapete che cosa funziona e cosa no. Ti vogliamo condividere quell'esperienza con noi su un giorno per giorno, in un certo senso tattico (vale a dire. eseguire i progetti veramente bene) ma anche strategico. "Best practice" sono un po' abusate come termine e ho esitato a usarlo. L'idea di base è che stai venendo come una persona con esperienza con esperienza profonda e pertinente e vogliamo integrare il meglio del tuo apprendimenti in quanto ci impegniamo con i clienti su un giorno per giorno.
  • Buon divertimento – Siamo un gruppo molto integrato. Voglio evitare un'altra banalità, ma in questo caso è davvero apt – lavoriamo sodo (sorta di) e si gioca ancora più difficile :). C'è una sorta di Aaron Sorkin di battute qui, la sala è sempre piena di gente intelligente, ci piace il nostro drink e organizziamo un discreto numero di divertimento eventi – movie night, viaggi di baseball (anche se sono orribile, squadre praticamente male).

Se io potrei riassumere tutti in una sola parola, Vorrei usare la parola "leadership". Condurre progetti, prendere un ruolo da protagonista nella costruzione della pratica (IP, costruire il team), ecc.

Ma attendere! Non c'è più! Perché altrimenti lavorare a Slalom?

  • Notevole unità d'intenti – tutti vogliono crescere questa cosa fuori. "Questa cosa" è l'ufficio di New York. Tutti sono a bordo con questo.
  • Vento nelle vostre vele – sorella uffici, sorella pratiche – Slalom è un "servizio completo" consulenza organizzazione. Conducono fino alla pratica di SharePoint (una "pratica Area Lead" in gergo Slalom). Ho sorella pratiche presso 11 altri uffici di Slalom. Così anche se io sono il re per quanto riguarda SharePoint è interessato qui a New York Slalom, Ho pratiche peer in Chicago, Seattle, Dallas, Atlanta, Boston, ecc. da cui posso attingere supporto. È davvero il meglio dei due mondi – significativa autonomia qui a New York, ma l'accesso a tonnellate di talento all'interno dell'organizzazione.
  • Vento nelle tue vendite (2) – Facciamo più di SharePoint – molto più. Facciamo BI, CRM, UX, consulenza aziendale, Mobile, sviluppo personalizzato e altri. Siamo bravi a cross-selling tra di noi e siamo buoni alla pittura – e ancora più importante, consegna su – una foto "full service" per i nostri clienti. Questo è particolarmente attraente per me. Sono stato a molti piccoli orgs lavorando su SharePoint concerti e frustrato più e più volte, perché eravamo piccione forata come il "popolo di SharePoint". Questo non accade con Slalom e si arriva a fare un lavoro più interessante come risultato.
  • Modello locale – nessun viaggio.
  • Crescita di lungo periodo – Slalom va gangbusters. Sacco di stabilità e crescita. Crescita significa anche che dobbiamo assumere leader oggi alla testa di nuove squadre come aggiungiamo ulteriori clienti e personale per supportare i client.

Potrei andare avanti, ma probabilmente già sono andato troppo a lungo. Penso che ho catturato l'essenza di qui. Se stai pensando di cambiare lavoro e questo sembra buono a voi, Let's talk.

Se sei felice al tuo attuale lavoro – Let's talk comunque :). Sono stato in un sacco di posti e all'epoca era molto "felice". Slalom è diversa e sarei lieta di una possibilità per convincerti che.

</fine>

undefinedIscriviti al mio blog.

Seguimi su Twitter a http://www.twitter.com/pagalvin

Facile e veloce: Impostare la dimensione di un elementi in una casella di riepilogo in un App Store di Windows

Sto creando in un'App di Windows Store, Voglio mostrare all'utente messaggi informativi vari.  Ho preso una ListBox come lo strumento per mostrarlo in modo che essi possono scorrere roba loro e tutto ciò che di buono. 

I messaggi sono solo informativi, quindi non è necessario per fornire supplementare tutto quello spazio vuoto intorno a loro, poiché l'utente non può selezionare mai per nulla.  Il comportamento predefinito del controllo ListBox fornisce una notevole quantità di imbottitura e ho voluto sbarazzarsi di esso.  Beh.... non si può fare cose del genere su ListBox direttamente.  TUTTAVIA, si può fare per gli elementi che si aggiungono:

        privato void AddGameStateLogMessage(stringa Strumento)
        {
            TextBox t = Nuovo TextBox();
            t.Text = GameStateCounter     + ": " + Strumento;
            t.TextWrapping = TextWrapping.Wrap;
            t.MinWidth = 400;
            Spessore thisPadding = Nuovo Spessore(5, 0, 5, 0);
            t.Padding = thisPadding;
            t.FontSize = 12;

            ListBoxItem li = Nuovo ListBoxItem();
            li.Contenuto = t;
            li.MaxHeight = 25;
            thisPadding = Nuovo Spessore(5, 0, 5, 0);
            li.Imbottitura = thisPadding;

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

in precedenza, Sto creando una casella di testo e impostare il tipo di carattere, sua imbottitura, ecc.

Successivo, Creo un oggetto ListBoxItem e impostarne il contenuto nella casella di testo formattato.

Infine, Inserire l'oggetto ListBoxItem in ListBox.  (Voglio mostrare i messaggi più recenti in cima alla lista, da qui l'inserto(0,li) invece di un semplice Add() invocazione.).

Sarà essere tweaking questo un po ' prima che io sono davvero felice con il comportamento del controllo ListBox, ma il modello sopra indicato è stato molto proficuo.  Speriamo che qualcun altro lo trova utile.

</fine>

undefinedIscriviti al mio blog.

Seguimi su Twitter a http://www.twitter.com/pagalvin